反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,而后会建立一个对象的Class对象,把字节码文件的信息所有都存储到该Class对象中,咱们只要获取到Class对象,咱们就能够使用字节码对象设置对象的属性或者调用对象的方法等操做jvm
这里记录下反射的简单使用,方便查阅ide
1 /******************* 2 获取class 3 *******************/
4 //Class clazz = Person.class;//方式一,经过类名获取 5 //Class clazz = new Person().getClass();//方式二,经过对象获取
6 Class clazz = Class.forName("reflect.Person");//方式三,经过完成限定名获取。参数为(包名+类名)。推荐使用,也是最经常使用
7
8 /******************* 9 获取某class的构造方法 10 ******************/
11 //Constructor[] constructor = clazz.getConstructors();//获取全部共有构造方法 12 //Constructor[] constructor = clazz.getDeclaredConstructors();//获取全部构造方法 13 //Constructor constructor = clazz.getConstructor(String.class,String.class);//获取某一个构造方法(不包括私有构造方法),参数为null表示获取无参构造方法
14 Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);//获取某一个构造方法(包括私有构造方法),参数为null表示获取无参构造方法
15 /******************* 16 执行构造方法 17 ******************/
18 constructor.setAccessible(true);//若是构造方法为私有,则需改变访问修饰权限
19 Person p =(Person) constructor.newInstance("100","jiuxiangfeng1");//参数为null表示执行无参构造方法
20
21 /******************* 22 获取方法 23 ******************/
24 //Method[] method = clazz.getMethods();//获取全部共有方法 25 //Method[] method = clazz.getDeclaredMethods();//获取全部方法 26 //Method method = clazz.getMethod("setName",String.class);//获取某个方法(不包括私有方法),第二个为可变参数,若是第二个参数为null表示该方法没有参数
27 Method method = clazz.getMethod("setName",String.class);//获取某个方法(包括私有方法),第二个为可变参数,若是第二个参数为null表示该方法没有参数
28 /******************* 29 执行方法 30 ******************/
31 //method.setAccessible(true);//若是方法为私有,执行前需改变访问修饰权限,不然会引起异常
32 method.invoke(p, "jiuxiangfeng2");//第一个参数为方法执行的对象,若是是静态方法,第一个参数应为null,第二个参数为可变参数,若是第二个参数为null表示该方法没有参数
33
34 /******************* 35 获取成员变量 36 ******************/
37 //Field[] field = clazz.getFields();//获取全部公共成员变量 38 //Field[] field = clazz.getDeclaredFields();//获取全部成员变量 39 //Field field = clazz.getField("name");//获取单个公共成员变量。参数为成员变量名
40 Field field = clazz.getDeclaredField("name");//获取单个成员变量。参数为成员变量名
41 /******************* 42 设置成员变量的值 43 ******************/
44 field.setAccessible(true);//若是为私有成员变量,那么应该改变其访问修饰权限为能够访问,不然引起异常
45 field.set(p, "jiuxiangfeng3");//设置某个对象成员变量的值. 参数1为哪一个对象,参数2为其成员变量的值
46 System.out.println(p);
以上代码执行都假设有一个Person.classthis
package reflect; public class Person { public String id; public String name; public Person(String id, String name) { super(); this.id = id; this.name = name; } public Person() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.id+"="+this.name; } }