反射
反射机制在运行状态中:
对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用它的任意一个方法和属性
反射提供的功能:
1、在运行时判断任意一个对象所属的类;
2、在运行时构造任意一个类的对象;
3、在运行时判断任意一个类所具有的成员变量和方法;
4、在运行时调用任意一个对象的方法;
5、生成动态代理。
反射对象的获取
①Class.forName(“全类名”)
此方法必须处理异常
②类名.class
③对象.getClass()
获取反射对象
使用:
1、class.全类名,有异常,必须处理异常
例如:
try {
Class<?> perClass1 = Class.forName("Exercise.Test.FanShe");
System.out.println(perClass1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2、类名.class
Class<?> perClass2 = FanShe.class;
3、对象.getclass()
FanShe fanShe = new FanShe();
Class<?> perClass3 =fanShe.getClass();
获取方法
1、公共的(①本类以及父类、接口的所有方法②符合访问修饰符的规律)
类名.getMethod();
2、本类的所有方法
类名. getDeclaredMethods();
3、获取所有实现的接口
类名. getInterfaces();
4、获取所有的父类
类名.getSuperclass();
5、获取所有的构造方法
类名. getConstructors();
获取属性
1、公共的(①本类以及父类、接口的所有方法②符合访问修饰符的规律)
类名. getFields();
2、本类的所有属性
类名. getDeclaredFields();
3、拿到对象的id
类名. getDeclaredFields(“id”);
4、对拿到的对象的id,重新赋值,第一个为对象,第二个为属性
类名. getDeclaredFields(“id”).set(类名.newInstance(),1);
访问的是private修饰的id,但是private是私有的
5、如果因为访问修饰符限制造成的异常,可以通过 属性(方法).setAccessible(true) 修改所以要修改访问权限
类名. getDeclaredFields(“id”).setAccessible(true);
6、获取当前反射所代表类(接口)的对象(实例)
类名.newInstance();