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