全部博文(2065)
分类: Java
2010-05-04 20:38:37
Java中的reflect
此文算是学习整理Java中的反射专题之用。待晚上详细阅读JAVA思想中的反射一章
Reflection
是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
心得:运行中的JAVA程序能够自检。
示例1.
public class Test {
public
static void main(String[] args) {
try
{
Class
c = Class.forName(args[0]);
Method
m[] = c.getDeclaredMethods();
for
(int i = 0; i < m.length; i++) {
System.out.println(m[i].toString());
}
}
catch (ClassNotFoundException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出这个类里面的声明方法列表!
二、使用反映的步骤
2.1 获得一个class对象
Class c = Class.forName(“java.lang.String”);
2.2 调用诸如getDeclaredMethods()方法获取此类里面的方法列表
Method m[]= c.getDeclaredMethods();
2.3 调用反射的相关API操作
System.out.println(m[0]);
模拟 instanceof 操作符
得到类信息之后,通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如,Class.isInstance 方法可以用于模拟 instanceof 操作符:
class A {
}
public class instance1 {
public static void main(String args[]) {
try {
Class cls =
Class.forName("A");//拿到一个类
boolean b1 =
cls.isInstance(new Integer(37));//模拟instanceof
System.out.println(b1);
boolean b2 =
cls.isInstance(new A());
System.out.println(b2);
} catch (Throwable e) {
System.err.println(e);
}
}
}
获取有关构造函数的方法
public class Test {
private String a;
public Test() {
// TODO Auto-generated
constructor stub
}
protected Test(int i,double d) {
}
public static void main(String[] args) {
try {
Class c = Class.forName("cn.ty.Test");
Constructor ctorlist[] = c.getConstructors();
for (int i = 0; i < ctorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name =
" + ct.getName());
System.out.println("declass:"+ct.getDeclaringClass());
Class pvev[] = ct.getParameterTypes();
for (int j
= 0; j < pvev.length; j++) {
System.out.println("param # "+j+" "+pvev[j]);
}
Class evec[] = ct.getExceptionTypes();
for (int j = 0; j < evec.length; j++) {
System.out.println("exc #" + j+ " " + evec[j]);
}
System.out.println("---------");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated
catch block
e.printStackTrace();
}
}
}
这个类可以实现自检操作。即检查自身的相关属性!