Java反射
2016-03-12 14:14
603 查看
Java语言允许通过程序化的方式间接对Class进行操作。Class文件由类装载器装载后,在JVM中将形成一份描述Class的对象,通过该对象可以获知Class的结构信息(构造方法,属性,方法),并分别通过Java实例对这些信息进行描述。Java允许用户通过这个Class相关的描述对象来间接调用类的功能。
类装载器ClassLoader
①ClassLoader工作机制
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。
在JVM中,类装载器将一个类装入JVM中,需要经过以下步骤
1)装载:查找和导入Class文件
2)链接:执行校验、准备和解析步骤,解析步骤可选:
a)校验:检查载入Class文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
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
①ClassLoader工作机制
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。
在JVM中,类装载器将一个类装入JVM中,需要经过以下步骤
1)装载:查找和导入Class文件
2)链接:执行校验、准备和解析步骤,解析步骤可选:
a)校验:检查载入Class文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
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");
相关文章推荐
- 3Sum | Java最短代码实现
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
- SpringMVC @RequestParam 中文乱码问题解决
- Java基础之修饰符
- java异常浅析
- 从JVM的角度看JAVA代码--代码优化
- Trie树的Java实现
- Java基础之String类
- Java正則表達式语法
- JAVA Executor实现并发线程
- struts2 json-plugin 提供跨站访问支持
- Java 高并发缓存与Guava Cache
- Java多线程之生产者消费者问题<二>:使用重入锁、条件变量优雅地解决生产者消费者问题
- XML以及XML解析方式[DOM+SAX]
- java编程基础小结
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 搭建Hadoop2.7.2开发环境1(编译Eclipse中hadoop插件hadoop2x-eclipse-plugin)
- 关于java开发技巧
- SPRING循环依赖(circular reference)的解决方法
- spring security执行流程图