Java基础巩固系列 反射机制(Reflection)
概述:
Person代码示例:
public class Person { public String name; private int age; public Person() { } public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } 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 void show() { System.out.println("我是一个人!"); } public void display(String nation) { System.out.println("我的国籍是" + nation); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
TestReflection代码示例:
public class TestReflection { //有了反射,可以通过反射创建一个类的对象,并调用其中的结构 @Test public void test2() throws Exception { Class<Person> clazz = Person.class; //1.创建calzz对应的运行时类Person类的对象 Person p = clazz.newInstance(); System.out.println(p); //2.通过反射调用运行时类的指定的属性 //2.1 public的属性 Field f1 = clazz.getField("name"); f1.set(p, "LiuDeHua"); System.out.println(p); //2.2 private的属性 Field f2 = clazz.getDeclaredField("age"); f2.setAccessible(true); f2.set(p, 23); System.out.println(p); //3.通过反射调用运行时类的指定的方法 Method m1 = clazz.getMethod("show"); m1.invoke(p); Method m2 = clazz.getMethod("display", String.class); m2.invoke(p,"CHN"); } //在有反射以前,如何创建一个类的对象,并调用其中的方法、属性 @Test public void test1() { Person p = new Person(); p.setAge(10); p.setName("TangWei"); System.out.println(p); p.show(); p.display("HK"); } }
test1结果:
Person{name='TangWei', age=10}
我是一个人!
我的国籍是HKtest2结果:
Person{name='null', age=0}
Person{name='LiuDeHua', age=0}
Person{name='LiuDeHua', age=23}
我是一个人!
我的国籍是CHN