要了解Java的反射机制,首先要知道反射机制的概念。
所谓反射机制,就是“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。基于这种看法,我、就我们所了解的Perl,Python是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods
下面我们以这代码来进一步了解一下Java的反射机制。
class Demo{
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception
{
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++)
{
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
}
Class owner_class = owner.getClass():首先还是必须得到这个对象的类。4~6行:配置参数的类数组,作为寻找Method的条件。
Method method =ownerClass.getMethod(methodName,argsClass):通过Method名和参数的类数组得到要执行的Method。
method.invoke(owner,args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。
接着我们来了解一下Java反射机制的几种功能:
Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法;
4.在运行时调用任意一个对象的方法;
5.生成动态代理。
通常我们谈会到动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”
没有其固定的意义,它是相对与“静态”而言的。
这里有几种Java 反射机制的使用方法:
1、获取一个Class对象
Class c = this.getClass();
ReflectImplement r = new ReflectImplement();//通过类实例获得
Class c1 = r.getClass();
Class subClass = c1.getSuperclass();//通过类实例获得父类对象
Class c2 = ReflectImplement.class;//通过类名.class获得
Class c3 = Class.forName("ReflectImplement");//通过类名字符串获得
2、获得类名称
3、修饰符Modifier
Modifier.toString(c2.getModifiers())//类的修饰符
Field[] fields1 = c2.getDeclaredFields();//该方法访问
Modifier.toString(field1[0].getModifiers())
4、检索类的构造函数
Constructor[] constructor = c1.getDeclaredConstructors();
for(int i = 0; i < constructor.length; i++)
{
Constructor cstr = constructor[i];
System.out.print("\n" + cstr.getName());
System.out.print("\n" + cstr.getDeclaringClass());
Class[] cp = cstr.getParameterTypes();
for(int j = 0; j < cp.length; j++)
{
System.out.print("\n" + cp[j]);
}
5、检索类的方法
Method [] methods = c1.getDeclaredMethods();
for(int i = 0; i < methods.length; i++)
{
Method method = methods[i];
Class cp[] = method.getParameterTypes();//该方法对应的参数类型
method.getExceptionTypes();
}
6、检索类所有成员
Field[] fields = c2.getFields();//该方法只能访问公共变量
for(int i = 0; i < fields.length; i++)
{
String str = fields[i].getName() + "" + fields[i].getType().getName();
}
Field[] fields1 = c2.getDeclaredFields();//该方法访问所有变量