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");复制代码