JAVA学习笔记-反射

1、反射是什么?

反射,就是通过生成的字节码来生成对象,扩展了程序的灵活性。具体,在java编程中首先需要编译生成字节码,即.class文件,JVM根据这些.class文件对对象进行管理,那么反射就是在这些文件基础上进行的操作。反射可以用来生成具体的对象、获得对象的某个属性值、执行对象的方法、获得类的静态属性、执行类的静态方法、有参、无参实例化等,反射进行的首要基础是生成运行时的Class对象,有三种方式,a Class runtimeClass=object.class b Class runtimeClass=Object.getClass() c Class runtimeClass=Class.forName("类所在的完整路径") ,生成了这个运行时的对象之后,就可以进行各种操作了。

反射类所在的包是 java.lang.reflect

2、反射怎么用?

Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

转自:http://java.ccidnet.com/art/3539/20070924/1222147_1.html

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性
public Object getProperty(Object owner, String fieldName) throws Exception

{
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
2. 得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName) throws Exception

{
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}

3. 执行某对象的方法

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);
}

4. 执行某个类的静态方法

public Object invokeStaticMethod(String className, String methodName,Object[] args) throws Exception

{
Class ownerClass = Class.forName(className);
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(null, args);
}

基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。

5. 新建实例
public Object newInstance(String className, Object[] args) throws Exception

{
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];

for (int i = 0, j = args.length; i < j; i++)

{
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);

return cons.newInstance(args);
}

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。


6. 判断是否为某个类的实例

public boolean isInstance(Object obj, Class cls)

{
return cls.isInstance(obj);
}

7. 得到数组中的某个元素
public Object getByArray(Object array, int index)

{
return Array.get(array,index);
}

posted @ 2012-01-18 14:53  王爵的技术博客  阅读(513)  评论(0)    收藏  举报

我的技术博客:https://biezhi.me

Github:https://github.com/biezhi 

微博:http://weibo.com/u/5238733773

Twitter:https://twitter.com/biezhii