1. 反射获取成员变量并且使用:
(1)获取字节码文件对象:
Class c = Class.forName("cn.itcast_01.Person");
(2)使用无参构造器创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
(3)获取所有的成员变量:
Field[] fields = c.getFields();//获取所有公共(public)成员变量
Field[] fields = c.getDeclaredFields();//获取所有成员变量
(4)获得单个成员变量:
Field addressField = c.getField("address");
addressField .set(obj, "北京" );// 给obj对象的addressField字段设置值为"北京"
(5)访问私有字段(暴力访问)
Field nameFeild = c.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(obj , "林青霞");
测试代码:
1 package cn.itcast_03; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 6 /* 7 * 通过发生获取成员变量并使用 8 */ 9 public class ReflectDemo { 10 public static void main(String[] args) throws Exception { 11 // 获取字节码文件对象 12 Class c = Class.forName("cn.itcast_01.Person"); 13 14 // 获取所有的成员变量 15 // Field[] fields = c.getFields(); 16 // Field[] fields = c.getDeclaredFields(); 17 // for (Field field : fields) { 18 // System.out.println(field); 19 // } 20 21 /* 22 * Person p = new Person(); p.address = "北京"; System.out.println(p); 23 */ 24 25 // 通过无参构造方法创建对象 26 Constructor con = c.getConstructor(); 27 Object obj = con.newInstance(); 28 System.out.println(obj); 29 30 // 获取单个的成员变量 31 // 获取address并对其赋值 32 Field addressField = c.getField("address"); 33 // public void set(Object obj,Object value) 34 // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 35 addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京" 36 System.out.println(obj); 37 38 // 获取name并对其赋值 39 // NoSuchFieldException 40 Field nameField = c.getDeclaredField("name"); 41 // IllegalAccessException 42 nameField.setAccessible(true); 43 nameField.set(obj, "林青霞"); 44 System.out.println(obj); 45 46 // 获取age并对其赋值 47 Field ageField = c.getDeclaredField("age"); 48 ageField.setAccessible(true); 49 ageField.set(obj, 27); 50 System.out.println(obj); 51 } 52 }
2. 通过反射获取成员方法
(1)通过反射获取无参无返回值成员方法并使用:
代码示例如下:
1 package cn.itcast_04; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Method; 5 6 public class ReflectDemo { 7 public static void main(String[] args) throws Exception { 8 // 获取字节码文件对象 9 Class c = Class.forName("cn.itcast_01.Person"); 10 11 // 获取所有的方法 12 // Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法 13 // Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法 14 // for (Method method : methods) { 15 // System.out.println(method); 16 // } 17 18 Constructor con = c.getConstructor(); 19 Object obj = con.newInstance(); 20 21 /* 22 * Person p = new Person(); p.show(); 23 */ 24 25 // 获取单个方法并使用 26 // public void show() 27 // public Method getMethod(String name,Class<?>... parameterTypes) 28 // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型 29 Method m1 = c.getMethod("show"); 30 // obj.m1(); // 错误 31 // public Object invoke(Object obj,Object... args) 32 // 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数 33 m1.invoke(obj); // 调用obj对象的m1方法 34 35 System.out.println("----------"); 36 // public void method(String s) 37 Method m2 = c.getMethod("method", String.class); 38 m2.invoke(obj, "hello"); 39 System.out.println("----------"); 40 41 // public String getString(String s, int i) 42 Method m3 = c.getMethod("getString", String.class, int.class); 43 Object objString = m3.invoke(obj, "hello", 100); 44 System.out.println(objString); 45 // String s = (String)m3.invoke(obj, "hello",100); 46 // System.out.println(s); 47 System.out.println("----------"); 48 49 // private void function() 50 Method m4 = c.getDeclaredMethod("function"); 51 m4.setAccessible(true); 52 m4.invoke(obj); 53 } 54 }