要想操作反射,必须先拿到反射的入口
1,通过通过Class.forName("全类名")
try {
Class> perClazz = Class.forName("reflect_fanshe.Person");
System.out.println(perClazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2,类名.class
Class> perClazz2 = Person.class;
3,对象.getClass()
Person person = new Person();
Class> perClazz3 = person.getClass();
三,根据反射入口对象(class)获取类的各种信息
可以用一个类的反射入口class对象获取类的所有信息
例1:perClazz.getMethods() 获取此类的所有public方法(父类的,实现接口的,自己的)
Class> perClazz = null;
try {
perClazz = Class.forName("reflect_fanshe.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method[] methods = perClazz.getMethods();
//遍历所有方法
for (Method method : methods) {
System.out.println(method);
}
}
例2:获取所有的构造方法
例3: 获取父类
例4:获取当前类(只有本类的)的所有方法和属性,包括私有的
重要:可以获取当前类的对象,并通过对象调用类的方法
四,通过反射获取对象的实例,并操作对象
1,class.newInstance() ,并强转类型,然后就可以操作对象了,主要是调用方法。
2,操作属性,可以操作类里面的public属性和private属性
如果属性是private,正常情况下是不允许外界操作属性值,这里可以用Field类的setAccessible(true)方法,暂时打开操作的权限
调用方法也一样,可以调用私有的方法,null是因为这个方法没有参数
五,在 程序执行中,动态的决定调用的类,以及方法
在本例中,程序执行之前,程序根本不知道具体的类和方法名是什么,需要执行时解析properties文件,但是反射就可以办到。
配置文件:
反射机制:
閱讀更多 網絡好無聊 的文章