反射 - Class类

[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]

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


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 + ";");
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值