davidgjy 发表于 2013-2-4 20:07:23

反射

反射(reflective)是指能够分析类的能力。

利用反射,我们可以在运行时分析类,查看对象。

在Java中类的运行时信息保存在Class类中。

那么,如何获得一个Class类的对象呢?

基本方法有三种:

1) 通过对象的getClass(类全名)方法
eg:
Employee e;
Class c = e.getClass();

2) 通过Class类自己的静态方法forName
eg:
String className = "java.util.Date";
Class c = Class.forName(className);

3) 通过"类名.class"来获取Class对象
eg:
Class c1 = Date.class;
Class c2 = int.class;
Class c3 = Double[].class;

反射最基本的一个应用就是:我们可以在运行时创建类的实例。

可以利用Class类的newInstance()方法创建类的实例。

例如:
e.getClass().newInstance();

Class.forName("java.util.Date").newInstance();

下面的例子是通过输入一个类名来打印出类的构造函数,方法和属性。

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 inputString name;if (args.length > 0)name = args;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 typesClass[] paramTypes = c.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0)System.out.print(", ");System.out.print(paramTypes.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 nameSystem.out.print("   " + Modifier.toString(m.getModifiers()));System.out.print(" " + retType.getName() + " " + name + "(");// print parameter typesClass[] paramTypes = m.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0)System.out.print(", ");System.out.print(paramTypes.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 + ";");}}}
页: [1]
查看完整版本: 反射