概念
通过反射机制,可以在运行时获得程序或者程序集中每个类型的成员和成员信息。
反射应用
通过反射获取Class对象
//1、 通过完整路径名获取Class对象
Class clazz = Class.forName("com.test.reflection.Student");
//2、 通过类的class属性(需要导入类的包)
Class clazz = Student.class;
//3、 通过对象的getClass()函数
Student student = new Student();
Class clazz = student.getClass();
获取成员变量
(1) getDeclaredFields // 获取所有声明字段,包括共有字段和私有字段
clazz.getDeclaredFields();
(2) getFields // 仅获取公有字段
clazz.getFields();
获取构造函数
(1) getDeclaredConstructors // 获取所有构造方法
clazz.getDeclaredConstructors();
(2) getConstructors // 仅获取共有构造方法
clazz.getConstructors();
获取非构造方法
(1) getDeclaredMethods; // 获取所有声明的非构造函数
clazz.getDeclaredMethods();
(2) getMethods; // 仅获取公有的非构造函数,(可以同时获得到父类的方法)
clazz.getMethods();
Method[] methods = clz.getMethods();
for(Method method : methods){
System.out.println(method.getName());
}
打印结果:
setUsername
setAge
getUsername
getAge
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
创建对象的方法
(1) 通过Class对象的newInstance()方法
Class clazz = User.class;
User use = (User) clazz.newInstance();
(2) 通过Constructor对象的newInstance()方法
Class clazz = Class.forName("com.test.reflection.user");
Constructor constructor = clazz.getConstructor();
User user = (User) constructor.newInstance();
同时,该方法可以选择特定构造方法,而Class对象则智能使用默认的无参构造方法
Class clazz = User.class;
Constructor constructor = clazz.getConstructor(String.class);
User user = (User) constructor.newInstance("hyx");
利用反射创建数组
@Test
public void createArray() throws ClassNotFoundException {
Class<?> clazz = Class.forName("java.lang.String");
Object array = Array.newInstance(clazz, 2);
Array.set(array, 0, "hyx");
Array.set(array, 1, "whm");
System.out.println(Array.get(array, 1));
}