Java反射

    Java语言容许经过程序化的方式间接对Class进行操做。Class文件由类装载器装载后,在JVM中将造成一份描述Class的对象,经过该对象能够获知Class的结构信息(构造方法,属性,方法),并分别经过Java实例对这些信息进行描述。Java容许用户经过这个Class相关的描述对象来间接调用类的功能。 java

  1. 类装载器ClassLoader 编程

    ①ClassLoader工做机制 数组

    类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。 函数

    在JVM中,类装载器将一个类装入JVM中,须要通过如下步骤 code

    1)装载:查找和导入Class文件 对象

    2)连接:执行校验、准备和解析步骤,解析步骤可选: 接口

              a)校验:检查载入Class文件数据的正确性; get

              b)准备:给类的静态变量分配存储空间; class

              c)解析:将符号引用转为直接引用; 变量

    3)初始化:对类的静态变量,静态代码块执行初始化工做。

    ②ClassLoader的重要方法

    *Class loadClass(String name),有一个重载方法Class loadClass(String name, boolean resolve)是否须要解析。

    *Class defineClass(String name, byte[] b, int off, int len)将类文件的byte数字转换为JVM内部的java.lang.Class对象。

    *Class findSystemClass(String name)

    *Class findLoadedClass(String name)

    *ClassLoader getParent()获取类装载器的父装载器。

  2. Java反射机制

    Class反射对象描述类与一结构,能够从Class对象中获取构造方法、成员变量、方法类等类元素的反射对象,并以编程的方式经过这些反射对象对目标类对象进行操做

    ①反射类

    *Constructor:类的构造函数反射类。经过Class#getConstructors()方法能够获取类的全部构造函数反射对象数组。Class#getConstructor(Class...param)来获取特定入参的构造函数。Constructor的主要方法为newInstance(Object [] param)来建立类的实例。

    *Method:类方法的反射类,经过Class#getDeclaredMethods()能够获取类的全部方法反射类对象数组。还能够经过Class#getDeclaredMethods(String methodName, Class...parameter)获取特定的方法。Method主要的方法为invoke(Object target, Object[] params)

    *Field:类的成员变量的反射对象,经过Class#getDeclareFields()获取全部,经过Class#getDeclareField(String name)获取特定。主要方法为set(Object obj, Object value)

ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.gy.Car");

Constructor cons = clazz.getDeclaredConstructor((Class[])null);
Car car = (Car)cons.newInstance();

Method setBrand = clazz.getDeclaredMethod("setBrand", String.class);
setBrand.invoke(car, "audi");

Field color = clazz.getDeclaredField("color");
color.setAccessible(true);
color.set(car, "red");
相关文章
相关标签/搜索