不想当将军的士兵不是好士兵,不想当高手的程序员不是好的程序员,
今天和大家说说Java中的反射机制吧,和高手又接近一步了.
1.什么是反射??
反射指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实例、或对其fields设值、或唤起其methods1。这种“看透class”的能力(the ability of the program to
examine itself)被称为introspection(内省、内观、反省)。
examine itself)被称为introspection(内省、内观、反省)。
2.反射与RTTI
RTTI在编译的时候打开和检查.class文件;
反射在运行时打开和检查.class文件.
3.如何使用Java的反射
第一步:获得你想操作的类的 java.lang.Class 对象。在运行中的 Java 程序中,用 java.lang.Class 类来描述类和接口等
第二步:调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表
第三步:使用 reflection API 来操作这些信息
4.看看反射的应用:
import java.lang.reflect.*;
public class DumpMethods {
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 (Throwable e) {
System.err.println(e);
}
}
}
按如下语句执行:
java DumpMethods java.util.Stack
它的结果输出为:
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)
这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。
这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类
public class DumpMethods {
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 (Throwable e) {
System.err.println(e);
}
}
}
按如下语句执行:
java DumpMethods java.util.Stack
它的结果输出为:
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)
这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。
这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类
注:反射的功能很强大,大家可以去看看相关的文档的,我上面只是讲了基本的概念,让大家有个了解,想要练成武林高手还要看自己的努力