您的位置:首页 > 编程语言 > Java开发

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 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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: