反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用字节码对象设置对象的属性或者调用对象的方法等操作
这里记录下反射的简单使用,方便查阅
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.class
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; } }
时间: 2024-10-10 21:57:03