package reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class ReflectDemo05_getFields { /* * 需求:通过反射获取成员变量并使用 * */ public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("reflex.Person"); // 获取所有的成员变量 // 1.这种方法也只能返回所有的公有的public // Field[] fields = c.getFields(); // public java.lang.String reflex.Person.address // 2.获取所有的还是需要Declare修饰的 // Field[] fields = c.getDeclaredFields(); // private java.lang.String reflex.Person.name // int reflex.Person.age // public java.lang.String reflex.Person.address // for (Field field : fields) { // System.out.println(field); // } /* * 例如: * Person p = new Person(); * p.address = "成都"; * sysout p */ // 通过无参构造方法创建对象 Constructor con = c.getConstructor(); Object obj = con.newInstance(); // 获取单个的成员变量 // 获取address并对其进行赋值 // 获取单个的成员变量 // 获取address并对其进行赋值 Field addressField = c.getField("address"); // public void set(Object obj, Object value) // throws IllegalArgumentException, IllegalAccessException // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 // 如果底层字段的类型为基本类型,则对新值进行自动解包。 addressField.set(obj, "成都"); System.out.println(obj); // declare // 获取name并对其赋值 // NoSuchFieldException 私有的 // Field nameField = c.getField("name"); Field nameField = c.getDeclaredField("name"); // 必须设置访问的属性,不然会报访问异常 nameField.setAccessible(true); nameField.set(obj, "mzy"); System.out.println(obj); Field ageField = c.getDeclaredField("age"); ageField.setAccessible(true); ageField.set(obj, 20); System.out.println(obj); } }
其中的person:
package reflex; public class Person { // 成员变量 private String name; int age; public String address; // 构造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } private Person(String name) { this.name = name; } public Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } // 成员方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } private void function() { System.out.println("function"); } }