反射:程序可以访问、检测和修改它本身状态或行为的能力
反射常用于:获取类信息、动态构造对象、动态调用方法等
一. 获取类对象的三种方法
1. 第一种:
Class class_name=Class.forName(“类的全路径”);
2. 第二种:
Class class_name=类名.class;
3. 第三种:
类名 对象名=new 类名();
Class class_name=对象名.getClass();
二. 动态创建对象
1. 通过类对象创建
Class className=类名.class;
类名 对象名=(类名)className.newInstance();
注:此处的newInstance()返回的是Object
2. 通过构造对象创建
Class className=类名.class;
Constructor 构造对象=className.getConstructor(参数类型列表);
注:获取的是非私有的构造方法
类名 对象名=(类名)构造对象.newInstance(实参);
三. 获取Class类的构造方法
1.获取单个构造函数(仅限公有)
Constructor getConstructor(Class [ ] param)
2.获取所有的构造函数(仅限公有)
Constructor [ ] getConstructors();
3.获取单个构造函数(包括私有)
Constructor getDeclaredConstructor(Class [ ] param);
4.获取所有的构造函数(包括私有)
Constructor [ ] getDeclaredConstructors();
四. 获取Class类的属性
1.获取单个属性(仅限公有)
Field getField(String name)
2.获取所有的属性(仅限公有)
Field [ ] getFields()
3.获取单个属性(包括私有)
Field getDeclaredField(String name);
4.获取所有的属性(包括私有)
Field [ ] getDeclaredFields();
五.获取Class类包含的方法
1.获取单个方法(仅限公有)
Method getMethod(String name,Class [ ] param)
2.获取所有的属性(仅限公有)
Method [ ] getMethods()
3.获取单个属性(包括私有)
Method getDeclaredMethod(String name,Class [ ] param)
4.获取所有的属性(包括私有)
Method [ ] getDeclaredMethods()
六.动态调用Method方法
1. 定义
Object invoke(Object obj,Object args)
—Method对象调用invoke
1.调用有参数的方法
Method m1=类对象.getMethod(“方法名”,参数列表);
m1.invoke(对象名,参数);
2.调用无参数的方法
Method m2=类对象.getMethod(“方法名”,null);
m2.invoke(对象名,null);