1、简介
- 定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。
- 反射机制类:
//类
java.lang.Class;
//构造方法
java.lang.reflect.Constructor;
//类的成员变量
java.lang.reflect.Field;
//类的方法
java.lang.reflect.Method;
//访问权限
java.lang.reflect.Modifier;
2、反射类
//通过Class类的静态方法——forName()来实现
Class<?> clazz = Class.forName("com.liujian.reflectdemo.Person");
3、反射创建对象
3.1 不带带参数构造
//Class对象调用newInstance()方法生成
Object obj = clazz.newInstance();
3.2 带参数构造
//对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成
//获取指定声明构造函数
Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
Object obj = constructor.newInstance(new Object[]{"liujian"});
4、反射方法
4.1获取所有方法
getMethods(): 获取包括自身和继承过来的所有的public方法
Method[] methods = clazz.getMethods();
getDeclaredMethods():获取自身类中所有的方法(不包括继承的,和访问权限无关)
Method[] methods = clazz.getDeclaredMethods();
4.2获取指定方法
getMethod():表示调用指定的一个公共的方法(包括继承的)
getDeclaredMethod:表示调用指定的一个本类中的方法(不包括继承的)
//无参
getMethod(String methodName)
getDeclaredMethod(String name)
//有参
getMethod(String methodName,Class<>… parameterTypes)
getDeclaredMethod(String name,Class<>… parameterTypes)
参数:
methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class
//直接写参数形式
Method method = clazz.getMethod("run",String.class);
//数组参数形式
Method method = clazz.getMethod("run",new class[]{String.class});
5、反射属性
//获取class对象的所有属性
Field[] allFields = clazz.getDeclaredFields();
//获取class对象的public属性
Field[] publicFields = clazz.getFields();
//获取class指定属性
Field ageField = clazz.getDeclaredField("age");
//获取class指定的public属性
Field desField = clazz.getField("des");
6、调用反射方法
public Object invoke(Object obj,Object… args):表示调用当前Method所表示的方法
参数:
obj: 表示被调用方法底层所属对象(调用静态方法的时可以为nul)
Method m = clz.getMethod("liujun",String.class);
args:表示调用方法是传递的实际参数
返回:
底层方法的返回结果
//如果调用私有方法,应该设置该方法为可访问的
method.setAccessible(true);
method.invoke(clazz,"liujian");