Java 反射机制
2014-06-24 14:48
274 查看
Person.java
Class类
输出结果:
Field类
输出结果:
Method类
Employee.java
Constructor类
输出结果:
Person [id=11, name=null, age=0]
Person [id=1001, name=李四, age=20]
Employee [id=1001, name=null]
true
Employee [id=101, name=zhang]
public class Person { private static String TAG = "Person"; public int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static String getTAG() { return TAG; } public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Person() { super(); this.id = 11; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } public int sum(int... numbers) { if (numbers.length == 0) return -1; int total = 0; for (int n : numbers) total += n; return total; } }
Class类
package reflect; public class reflectClass { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { // 1.通过类来得到Class对象 Class<?> clz1 = Person.class; System.out.println("clz1----->" + clz1); // 2.通过对象来获取其Class信息 Person p = new Person(); Class<?> clz2 = p.getClass(); System.out.println("clz2----->" + clz2); // 3.通过Class.forName()方式获取Class信息 Class<?> clz3 = Class.forName("reflect.Person"); System.out.println("clz3----->" + clz3); System.out.println(clz1 == clz2); System.out.println(clz3 == clz2); Class<Person> clz4 = Person.class; Person person = clz4.newInstance(); System.out.println("person----->" + person); } }
输出结果:
clz1----->class reflect.Person clz2----->class reflect.Person clz3----->class reflect.Person true true person----->Person [id=11, name=null, age=0]
Field类
package reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class reflectField { public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Person person = new Person(1001, "zhang", 18); Class<?> clz = person.getClass(); // 如何获取公有字段 Field f = clz.getField("id"); System.out.println(f); Object obj = f.get(person); System.out.println("公有字段id----->" + obj); // 如何获取私有字段 f = clz.getDeclaredField("name"); System.out.println(f); f.setAccessible(true); obj = f.get(person); System.out.println("私有字段name----->" + obj); // 如何获取静态字段 f = clz.getDeclaredField("TAG"); System.out.println("该属性是否为静态属性:" + Modifier.isStatic(f.getModifiers())); System.out.print("获取:"); f.setAccessible(true); System.out.println("" + f.get(null)); System.out.print("设置 : "); f.set(null, "new value"); System.out.println(Person.getTAG()); // 获取所有字段 Field[] fs = clz.getDeclaredFields(); for (Field field : fs) { System.out.println(field); } } }
输出结果:
public int reflect.Person.id 公有字段id----->1001 private java.lang.String reflect.Person.name 私有字段name----->zhang 该属性是否为静态属性:true 获取:Person 设置 : new value private static java.lang.String reflect.Person.TAG public int reflect.Person.id private java.lang.String reflect.Person.name private int reflect.Person.age
Method类
package reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class reflectMethod { @SuppressWarnings("unchecked") public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Person person = new Person(1, "李四", 20); Class<Person> clz = (Class<Person>) person.getClass(); Method method = clz.getMethod("getAge"); int age = (Integer) method.invoke(person); System.out.println(age); Method setMethod = clz.getDeclaredMethod("setAge", int.class); setMethod.setAccessible(true); setMethod.invoke(person, 30); System.out.println(person.getAge()); Method arrayMethod = clz.getDeclaredMethod("sum", int[].class); int result = (Integer) arrayMethod .invoke(person, new int[] { 1, 2, 3 }); System.out.println(result); } }
Employee.java
package reflect; public class Employee { private static Employee employee; private int id; private String name; private Employee() { } private Employee(int id, String name) { super(); this.id = id; this.name = name; } public static Employee getInstance() { if (employee == null) employee = new Employee(); return employee; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + "]"; } }
Constructor类
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class reflectConstructor { @SuppressWarnings("unchecked") public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { // 使用无参/默认构造器创建对象实例 Class<?> clz = Person.class; Person instance = (Person) clz.newInstance(); System.out.println(instance); // 调用公开构造器创建对象实例(有参) Constructor<Person> constructors = (Constructor<Person>) clz .getConstructor(int.class, String.class, int.class); Person person = constructors.newInstance(1001, "李四", 20); System.out.println(person); Employee employee = Employee.getInstance(); employee.setId(1001); System.out.println(employee); Employee employee1 = Employee.getInstance(); Employee employee2 = Employee.getInstance(); System.out.println(employee1 == employee2); Class<Employee> empClz = Employee.class; Constructor<Employee> cons = (Constructor<Employee>) empClz.getDeclaredConstructor(int.class,String.class); cons.setAccessible(true); Employee emp = cons.newInstance(101,"zhang"); System.out.println(emp); } }
输出结果:
Person [id=11, name=null, age=0]
Person [id=1001, name=李四, age=20]
Employee [id=1001, name=null]
true
Employee [id=101, name=zhang]
相关文章推荐