你的位置:首页 > Java教程

[Java教程]Java Reflection


* 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");

reflection

 * 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());  }

getClass

 *  Java动态代理