标签:
* Java Reflection
Reflection 是被视为动态语言的关键,反射脊椎允许程序在执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
* Java 反射机制提供的功能
>在运行时判断任意一个对象所属的类。
>在运行时构造任意一个类的对象。
>在运行时判断任意一个类所具有的成员变量和方法。
>在运行时调用任意一个对象的成员变量
>生成动态代理
* 放射相关的API
>java.lang.Class(类)
>java.lang.reflect.Method(类的方法)
>java.lang.reflect.Field(成员变量)
>java.lang.reflect.Constructor(构造方法)
* code
//通过反射创建一个类的对象 Class clazz = Person.class; Person person = (Person) clazz.newInstance(); Field name = clazz.getField("name"); name.setAccessible(true); name.set(person, "Nyan_Shen"); System.out.println(person.getName()); Method show = clazz.getMethod("show"); show.invoke(person); //有参数的方法,String.class为参数类型 Method display = clazz.getMethod("display", String.class); display.invoke(person, "Nyan Shen");
* Class(放射的源头)
正常方式:引入包-->通过new实例化-->取得实例对象
反射方式:实例化对象-->getClass方法-->得到完整的包类型
创建一个类,通过编译(javac.exe)生成对应的class文件。然后使用java.exe加载(JVM的类加载器完成此.class文件)此.class 文件加载到内存以后,就是一个运行时类,存在缓存区。n那么这个类本身就是一个class的实例,一个运行时类只加载一次。
@Test public void test003() throws Exception{ //获取class类的三种方法 //1、调用运行时类本身的class属性 Class clazz1 = Person.class; System.out.println(clazz1.getName()); //2、通过运行时类的对象 Person person = new Person(); Class clazz2 = person.getClass(); System.out.println(clazz2.getName()); //3、通过class的静态方法获取 String className = "com.nyan.clazz.bean.Person"; Class clazz3 = Class.forName(className); System.out.println(clazz3.getName()); //4、通过类的加载器 ClassLoader classLoader = this.getClass().getClassLoader(); Class clazz4 = classLoader.loadClass(className); System.out.println(clazz4.getName()); }
* Java动态代理
标签:
原文地址:http://www.cnblogs.com/Nyan-Workflow-FC/p/4776931.html