//通过反射,先创建Person类的对象 Class clazz = Person.class; Constructor cons = clazz.getConstructor(String.class,int.class); Object obj = cons.newInstance("Tom", 12); Person p = (Person) obj; System.out.println(p.toString());
//通过反射,调用对象指定的属性、方法 //调用属性 Field age = clazz.getDeclaredField("age"); age.set(p,10); System.out.println(p.toString());
//调用方法 Method show = clazz.getDeclaredMethod("show"); show.invoke(p);
//通过反射,可以调用Person类的私有结构。比如:私有的构造器、方法、属性 //调用私有属性 Field name = clazz.getDeclaredField("name"); //保证当前属性是可访问的 name.setAccessible(true); name.set(p,"newTom"); System.out.println(p.toString());
public java.lang.String reflection.Person.toString() public java.lang.String reflection.Person.getName() public void reflection.Person.setName(java.lang.String) public void reflection.Person.show() public void reflection.Person.setAge(int) public int reflection.Person.getAge() public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public final void java.lang.Object.wait() throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()
public java.lang.String reflection.Person.toString() public java.lang.String reflection.Person.getName() public void reflection.Person.setName(java.lang.String) public void reflection.Person.show() public void reflection.Person.setAge(int) private java.lang.String reflection.Person.showNation(java.lang.String) public int reflection.Person.getAge()
反射的应用:动态代理
反射的应用在动态代理中比较明显,在基于JDK的动态代理中,就是利用了反射机制(method.invoke()),调用到目标对象的方法,实现相应的功能。 反射更重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过 XML 文件配置 Bean),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射,运行时动态加载需要加载的对象。