java反射-java Class基本使用
通过Class类获取对象完整包类名:
我们新建一个Student类:
package com.java1234.chap07.sec01; public class Student { }
我们新建一个测试类:
package com.java1234.chap07.sec01; public class Test01 { public static void main(String[] args) { Student student=new Student(); System.out.println(student.getClass().getName()); } }
运行输出:
com.java1234.chap07.sec01.Student
这里对象.getClass() 调用的是Object类的getClass() 得到Class对象 然后再调用Class里的getName()方法,获取到完整包路径类;
通过完整包路径类型来实例化Class对象:
package com.java1234.chap07.sec01; public class Test02 { public static void main(String[] args) { try { Class<?> c=Class.forName("com.java1234.chap07.sec01.Student"); System.out.println(c.getName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行输出:
com.java1234.chap07.sec01.Student
通过得到Class对象,我们可以通过Class对象得到com.java1234.chap07.sec01.Student类的完整结构;
通过完整包路径类型来实例化Class对象,再通过Class对象获取Student类实例:
我们先改写下Student类:
package com.java1234.chap07.sec01; public class Student { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
我们写个测试类:
package com.java1234.chap07.sec01; public class Test03 { public static void main(String[] args) { Class<?> c=null; try { c=Class.forName("com.java1234.chap07.sec01.Student"); System.out.println(c.getName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Student s=null; try { s=(Student) c.newInstance(); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } s.setName("小锋"); s.setAge(28); System.out.println(s); } }
我们改下上面的Student 加下有参构造方法,这样使得Student类没有默认无参构造方法:
package com.java1234.chap07.sec01; public class Student { private String name; private Integer age; public Student(String name, Integer age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
然后我们再运行上面的测试类:
报错了 找不到默认构造方法;
在这种情况下,我们可以通过Class类来获取Student类里的构造方法,再调用构造方法即可,我们前面说过,可以通过反射获取整个类的结构,
包括 属性 方法 构造方法 等等。
我们给下测试代码:
package com.java1234.chap07.sec01; import java.lang.reflect.Constructor; public class Test04 { public static void main(String[] args) { Class<?> c=null; try { c=Class.forName("com.java1234.chap07.sec01.Student"); System.out.println(c.getName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Student s=null; Constructor<?>[] cons=c.getConstructors(); try { s=(Student) cons[0].newInstance("小锋",28); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(s); } }
运行输出:
com.java1234.chap07.sec01.Student
Student [name=小锋, age=28]
上一篇:JAVA反射-反射的基本概念
下一篇:通过反射获取类的基本结构