Reflection 是 Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时通过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,包括其 modifiers(诸如 public, static 等等)、superclass(例如 Object)、实现的 interfaces,也包括 fields 和 methods 的所有 信息,并可于运行时改变 fields内容或调用 Constructor,methods。
上面的看不懂,我们来看下面的:
- 什么是反射:根据我的理解,反射应该是再运行的状态下,可以知道任意一个类所继承的接口,共有的方法,方法的个数,以及每个方法的参数类型,方法的类型,动态地调用运行。
- 我们上一篇说了动态的绑定,其实对于动态的理解,大概会是这样定义“在程序运行的时候,允许改变程序结构或者变量类型,这样的语言一般会被我们成为动态的语言。”,虽然java不是动态语言,但是java有着动态相关机制,即Reflection 。
- 具体来说会有两个特征:一是java可以在运行的时候才知道类的名字,那就会在编译的时候未知类的名字;二是在运行的时候对fileds设值,或者唤起methods。
下面来介绍一下这个重要的java.lang.reflect包。
java.lang.reflect:提供接口与类,用来获取类和对象的反射信息
主要有一下这些类
- Class类:是反射的核心类,可供获取类名,它是java.lang包下的;
public String getName() {
String name = this.name;
if (name == null)
this.name = name = getName0();
return name;
}
如: Class<?> c = Class.forName("com.chan.ref0122.BWM");
2.Field类:java.lang.reflect.Field
getFields(): 获取类中public类型的属性
java.lang.reflect.Field[] fields=c1.getFields();
System.out.println("共有属性:"+fields.length);
for(java.lang.reflect.Field f:fields)
{
String fName=f.getName();
System.out.println("属性名字:"+fName);
Class<?> fType=f.getType();
System.out.println("属性类型:"+fType);
//获取属性访问的限定符
int mType=f.getModifiers();
//判断何种限定符
if(java.lang.reflect.Modifier.isPublic(mType))
{
System.out.println("isPublic");
}
if(java.lang.reflect.Modifier.isAbstract(mType))
{
System.out.println("isAbstract");
}
if(java.lang.reflect.Modifier.isFinal(mType))
{
System.out.println("isFinal");
}
}
对于类中的属性,我们常用的操作:获取属性的值、修改属性的值。
3.Method类:java.lang.reflect.Method,可以获取类的方法;我们可以发现这是一个数组,当我们得到这个数组之后就获取到了所有类的方法,以及方法的类型,参数,参数类型等。
java.lang.reflect.Method[] methods=c1.getMethods();
4.Constructor类:代表类的构造方法。
//获得类中的构造器对象数组
java.lang.reflect.Constructor[] cons=c1.getConstructors();
5.Array类:提供了动态创建数组,以及访问数组的元素的静态方法。