[color=blue][b]反射(reflective)是指能够分析类的能力。[/b][/color]
利用反射,我们可以在运行时分析类,查看对象。
[color=red][b]在Java中类的运行时信息保存在Class类中。[/b][/color]
那么,如何获得一个Class类的对象呢?
基本方法有三种:
[b]1) 通过对象的getClass(类全名)方法[/b]
eg:
[color=blue]Employee e;
Class c = e.getClass();[/color]
[b]2) 通过Class类自己的静态方法forName[/b]
eg:
[color=blue]String className = "java.util.Date";
Class c = Class.forName(className);[/color]
[b]3) 通过"类名.class"来获取Class对象[/b]
eg:
[color=blue]Class c1 = Date.class;
Class c2 = int.class;
Class c3 = Double[].class;[/color]
反射最基本的一个应用就是:我们可以在运行时创建类的实例。
可以利用Class类的newInstance()方法创建类的实例。
例如:
[color=blue]e.getClass().newInstance();
Class.forName("java.util.Date").newInstance();[/color]
下面的例子是通过输入一个类名来打印出类的构造函数,方法和属性。
利用反射,我们可以在运行时分析类,查看对象。
[color=red][b]在Java中类的运行时信息保存在Class类中。[/b][/color]
那么,如何获得一个Class类的对象呢?
基本方法有三种:
[b]1) 通过对象的getClass(类全名)方法[/b]
eg:
[color=blue]Employee e;
Class c = e.getClass();[/color]
[b]2) 通过Class类自己的静态方法forName[/b]
eg:
[color=blue]String className = "java.util.Date";
Class c = Class.forName(className);[/color]
[b]3) 通过"类名.class"来获取Class对象[/b]
eg:
[color=blue]Class c1 = Date.class;
Class c2 = int.class;
Class c3 = Double[].class;[/color]
反射最基本的一个应用就是:我们可以在运行时创建类的实例。
可以利用Class类的newInstance()方法创建类的实例。
例如:
[color=blue]e.getClass().newInstance();
Class.forName("java.util.Date").newInstance();[/color]
下面的例子是通过输入一个类名来打印出类的构造函数,方法和属性。
package coretrain.reflection;
import java.util.*;
import java.lang.reflect.*;
public class ReflectionTest {
public static void main(String[] args) {
// read class name from command line args or user input
String name;
if (args.length > 0)
name = args[0];
else {
Scanner in = new Scanner(System.in);
System.out.println("Enter class name (e.g. java.util.Date): ");
name = in.next();
}
try {
// print class name and superclass name (if != Object)
Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
System.out.print("class " + name);
if (supercl != null && supercl != Object.class)
System.out.print(" extends " + supercl.getName());
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.exit(0);
}
/**
* Prints all constructors of a class
*/
public static void printConstructors(Class cl) {
Constructor[] constructors = cl.getDeclaredConstructors();
for (Constructor c : constructors) {
String name = c.getName();
System.out.print(" " + Modifier.toString(c.getModifiers()));
System.out.print(" " + name + "(");
// print parameter types
Class[] paramTypes = c.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0)
System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
/**
* Prints all methods of a class
*/
public static void printMethods(Class cl) {
Method[] methods = cl.getDeclaredMethods();
for (Method m : methods) {
Class retType = m.getReturnType();
String name = m.getName();
// print modifiers, return type and method name
System.out.print(" " + Modifier.toString(m.getModifiers()));
System.out.print(" " + retType.getName() + " " + name + "(");
// print parameter types
Class[] paramTypes = m.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0)
System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
/**
* Prints all fields of a class
*/
public static void printFields(Class cl) {
Field[] fields = cl.getDeclaredFields();
for (Field f : fields) {
Class type = f.getType();
String name = f.getName();
System.out.print(" " + Modifier.toString(f.getModifiers()));
System.out.println(" " + type.getName() + " " + name + ";");
}
}
}

被折叠的 条评论
为什么被折叠?



