在运行状态中,对于一个任意类,可以获取类的属性和方法对于任意一个对象,可以调用对象属性和方法。这种动态获取信息及动态调用属性和方法的功能称为反射机制 | ||||||||
实际使用时,就是把Java类中各个成分通过Class对象映射成一个个Java对象 | ||||||||
Object.getClass(); 对象.class Class.forName(“包名.类名”)
| ||||||||
|
|
|
| |||||
返回值:Constructor[] |
| 返回值:Constructor |
| |||||
getConstructors() | 所有public构造方法 | getConstructor(Class…parameterTypes) | 获取指定形参public方法 | |||||
getDeclaredConstructors() | 获取所有构造方法 | getDeclaredConstructor(Class…parameterType) | 获取指定形参构造方法 | |||||
newInstance(Object... initargs) | 用指定的初始化参数初始化该实例。 |
|
| |||||
调用构造方法: * Constructor-->newInstance(Object... initargs) | ||||||||
con = clazz.getDeclaredConstructor(char.class); System.out.println(con); //调用构造方法 con.setAccessible(true);//暴力访问(忽略掉访问修饰符)针对私有方法 obj = con.newInstance('男');
| ||||||||
|
|
|
| |||||
返回值:Field[] |
| 返回值:Field |
| |||||
getFields() | 获取public变量 | getField(“variablename”) | 获取指定public变量 | |||||
getDeclaredField() | 获取任意变量 | getDeclaredField(“variablename”) | 获取指定任意变 量 | |||||
Field--àpublic void set(Object obj,Object value) 参数说明: * 1.obj:要设置的字段所在的对象; * 2.value:要为字段设置的值; | ||||||||
Field f = stuClass.getField("name"); System.out.println(f); //获取一个对象 Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student(); // f.setAccessible(true);//暴力反射,如果涉及私有限定,解除私有限定。 //为字段设置值 f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华" //验证 Student stu = (Student)obj; | ||||||||
|
|
|
| |||||
getMethods() | 获取public方法 | getMethod(String name,Class<?>... parameterTypes): name : 方法名; Class ...形参的Class类型对象 | 获取指定形参的public方法 | |||||
getDeclaredMethods() | 获取所有的成员方法 | getDeclaredMethod(String name,Class<?>... parameterTypes) | 获取指定形参所有成员方法 | |||||
public Object invoke(Object obj,Object... args): * 参数说明: * obj : 要调用方法的对象; * args:调用方式时所传递的实参 | ||||||||
System.out.println("***************获取公有的show1()方法*******************"); Method m = stuClass.getMethod("show1", String.class); System.out.println(m); //实例化一个Student对象 Object obj = stuClass.getConstructor().newInstance(); m.invoke(obj, "刘德华");
System.out.println("***************获取私有的show4()方法******************"); m = stuClass.getDeclaredMethod("show4", int.class); System.out.println(m); m.setAccessible(true);//解除私有限定 Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参 System.out.println("返回值:" + result);
| ||||||||
|
|
|
| |||||
反射main方法 |
|
|
| |||||
//1、获取Student对象的字节码 Class clazz = Class.forName("fanshe.main.Student");
//2、获取main方法 Method methodMain = clazz.getMethod("main", String[].class);//第一个参数:方法名称,第二个参数:方法形参的类型, //3、调用main方法 // methodMain.invoke(null, new String[]{"a","b","c"}); //第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数 //这里拆的时候将 new String[]{"a","b","c"} 拆成3个对象。。。所以需要将它强转。 methodMain.invoke(null, (Object)new String[]{"a","b","c"});//方式一 // methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二 | ||||||||
参考 https://blog.youkuaiyun.com/sinat_38259539/article/details/71799078