JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
可以动态获取和调用类的属性和方法,如果你不知道一个类有什么属性和方法,可以利用反射机制获取,比如eclipse中当你在对象之后输入"."的时候会有一个下拉框显示属性和方法让你选择,就是利用了反射机制。
JAVA反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法。一般都是在配置文件中才用的。hibernate的映射文件,spring的配置文件都是通过反射做的。
众所周知Java中有个Object class,是所有Java classes的继承根源,其内生命了数个应该在所有 Java class 中被改写的methods:hashCode()、equals()、clone()、
toString()、getClass() 等。其中getClass() 返回一个Class object 。
Class class 十分特殊。它和一般classes 一样继承自Object,其实体用以表达Java程序运行时的 classes 和 interfaces,也用来表达 enum、array、primitve Java Types(booelan、byte、char、short、int、long、float、double)以及关键词void。 当一个class被加载,或者加载器(class loader)的defineClass() 被JVM调用,JVM便自动产生一个Class object。如果您想借由“修改Java标准库源码”来观察Class object的实际生成时机(例如在Class 的constructor内添加一个println() ),这样是行不通的!因为Class 并没有public constructor。本文章最后悔拨一小块篇幅顺带谈谈Java标准库源码的改动方法。
Class 是Reflection 故事起源。针对任何您想探勘的 class,唯有先为它产生一个 Class object,接下来才能由后者唤起为数十多个的 Reflection APIs。这些APIs将在稍后的一一讲解。
public final
class Class<T> implements Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
private Class() {}
public String toString() {
return ( isInterface() ? "interface " :
(isPrimitive() ? "" : "class "))
+ getName();
}
....
}
注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生。
Java允许我们从多种管道为一个class生成对应的Class object。
Class object 诞生管道
1)运用 getClass() 对象.getClass( )
注:每个class 都有此函数
2)运用 static method
Class.forName() //完整的 包.类名
3)运用 primitive wrapper classes 或者 类名.class
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Java classes 组成分析
首先容我以java.util.LinkedList为例,将Java class的定义大卸八块,每一块分别对应不同的 Reflection API。图5则是“获得class各区块信息”的程序示例及执行结果,它们都取自本文示例程序的对应片段。
package java.util; //(1)
import java.lang.*; //(2)
public class LinkedList<E> //(3)(4)(5)
extends AbstractSequentialList<E> //(6)
implements List<E>, Queue<E>,
Cloneable, java.io.Serializable //(7)
{
private static class Entry<E> { … }//(8)
public LinkedList() { … } //(9)
public LinkedList(Collection<? extends E> c) { … }
public E getFirst() { … } //(10)
public E getLast() { … }
private transient Entry<E> header = …; //(11)
private transient int size = 0;
}
(1) package class隶属哪个package
Package getPackage()
获取此类的包。
(2) import class导入哪些classes
无直接对应之API。
(3) modifier class(或methods, fields)的修饰符
int getModifiers()
Modifier.toString(int)
Modifier.isInterface(int)
(4) class name or interface name
class/interface名称.getName()
String
(5) type parameters 参数化类型的名称
TypeVariable<Class<T>>[] getTypeParameters()
(6) base class
base class(只可能一个)
getSuperClass()
Class
(7) implemented interfaces
实现有哪些interfaces
getInterfaces()
Class[]
(8) inner classes
内部classes
getDeclaredClasses()
Class[]
(8') outer class
如果我们观察的class 本身是inner classes,那么相对它就会有个outer class。
getDeclaringClass()
Class
(9) constructors
构造函数getDeclaredConstructors()
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
Constructor[]
(10) methods
操作函数getDeclaredMethods()
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
Method[]
(11) fields
字段(成员变量)
getDeclaredFields()不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
Field[]
接下来讨论Reflection 的另三个动态性质:
(1) 运行时生成instances,
(2) 执行期唤起methods,
(3) 运行时改动fields。
接下来讨论Reflection 的另三个动态性质:
(1) 运行时生成instances,
(2) 执行期唤起methods,
(3) 运行时改动fields。