Java反射机制
-
动态的获取任意属性和方法的一种方式
-
获取反射对象有3中方式:
1、类名.class Class<?> clazz = User.class; 2、对象.getClass(); User user = new User(); Class<?> clazz2 = user.getClass(); 3、Class.forName(完整类名); Class<?> clazz3 = Class.forName("com.hym.test.User")
结论:无论哪种方式获取的反射对象,都是同一个反射对象
syso(clazzclazz2); //true
syso(clazz2clazz3); //true -
回忆,在数据库中加载驱动,我们就是使用第三种’ Class.forName(" com.mysql.jdbc.Driver ") ';目的是为了初始化数据库Driver类中的static{}
-
通过反射对象去设置和获取属性
- 1、获取反射对象
- 2、通过反射对象拿到Field对象
Field field = clazz.getDeclaredField(“name”); - 3、通过Field对象去设置和获取属性
如果是私有属性的设置访问权限field.setAccessible(true)---默认为false访问不了私有属性 Object obj = clazz.newInsatnce(); //设置属性 field.set(obj,values); field.get(obj); //得到实体类中的属性值 //获取Field数组(字段) //getFields(),执行效率高,只能设置和获取非私有的属性 //getDeclaredFields(): 可以设置和获取私有的属性
-
通过反射对象去获取和使用方法
1、获取反射对象
2、通过反射对象拿到Method对象—方法名,参数类型
3、通过Method对象调用方法———invokeClass<?> clazz = User.class; //type是反射对象的形式 Method method = clazz.getDeclaredMethod("方法名",String.class,int.class); mehthod.setAccessible(true); Object obj = clazz.newINstance(); method.invoke(obj,"hmm",2);
-
通过反射机制调构造方法:
1、获取反射对象
2、通过反射对象获取构造器对象。Constructor
3、通过构造器调构造方法 newInstanceClass<?> clazz = Student.class; //clazz.newInstance(); 调用无参构造方法且非私有; Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); //设置权限 constructor.setAccessible(true); constructor.newInstance("hym");
* 应用场景:
* 案例:通过反射机制灵活获取用户或学生的对象
类比直接面向对象 静态工厂模式;
```
User u = Tool.getReflect(User.class);
Student st = Tool.getReflect(Student.class);
//---------->
Tool.getReflect(*.class):
public static <T> T getReflect(Class<T> clazz){
return clazz.newInstance;
}
```