反射的概述_反射应用实例
Reflection(反射)是被视为动态语言的关键,
反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
并能直接操作任意对象的内部属性及方法
package com.aff.reflection; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /* Reflection(反射)是被视为动态语言的关键, 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息, 并能直接操作任意对象的内部属性及方法 Java反射机制提供的功能: ①在运行时判断任意一个对象所属的类 ② 在运行时构造任意一个类的对象 ③在运行时判断任意一个类所具有的成员变量和方法 ④在运行时调用任意一个对象的成员变量和方法 ⑤生成动态代理 反射相关的主要API: ① java.lang.Class:代表一个类 ②java.lang.reflect.Method:代表类的方法 ③java.lang.reflect.Field:代表类的成员变量 ④java.lang.reflect.Constructor:代表类的构造方法 。。。 */ public class TestReflection { // 有了反射,可以通过反射创建一个类的对象,并调用其中的结构 @Test public void test2() throws Exception { Class<Person> clazz = Person.class; // 1.创建clazz对应的运行时类的Person类的 Person p = clazz.newInstance(); System.out.println(p);// Person [name=null, age=0] // 2.通过反射调用运行时类的指定的属性 // 2.1public 的属性 Field f1 = clazz.getField("name"); f1.set(p, "李白"); System.out.println(p);// Person [name=李白, age=0] // 2.2private 的属性 使用getDeclaredField ,setAccessible(true) Field f2 = clazz.getDeclaredField("age"); f2.setAccessible(true); f2.set(p, 33); System.out.println(p);// Person [name=李白, age=33] // 3.通过反射调用运行时类的指定的方法 Method m1 = clazz.getMethod("show"); m1.invoke(p);//后面可以跟参数,没有就去掉, 得即高歌失即休 Method m2 = clazz.getMethod("display", String.class);//Class<?>... parameterTypes,
//应写class类型的 m2.invoke(p, "罗隐");//多愁多恨亦悠悠 \n 罗隐 } // 在有反射机制以前,如何创建一个类的对象,并调用其中的方法,属性 @Test public void test1() { Person p = new Person(); p.setAge(35); p.setName("罗隐"); System.out.println(p); p.show(); p.display("晚唐"); } }
All that work will definitely pay off