- 一、反射机制
- 二、Class类
- 三、反射机制检查类的结构
能够动态分析类能力的程序。
反射机制可以用来:
- 运行时分析类的能力
- 在运行时检查对象,例如可以编写一个适用于所有类的toString方法
- 实现泛型数组操作代码
- 利用Method对象,这个对象很像C++中的函数指针。
获得Class类的对象的三种方法
//反射机制学习
// 之前已经写了一个Employee对象 ee
//1. 跟踪一个对象的类名
Class cl=ee.getClass(); //获得一个Class类型的实例
System.out.println(ee.getClass().getName()+" "+ ee.getName());
//如果类在包里,包的名字也作为类名的一部分
Random generator=new Random();
cl=generator.getClass();
String Name=cl.getName(); //name is java.util.Random
//2. 还可以使用静态方法forName获得类名对应的Class对象
String className="java.util.Random";
// Class cl2=Class.forName(className);
//3. 获得class对象的第三种方法(直接获得!):
//T是任意的Java类型,T.class代表匹配的类的对象
Class cl1=Random.class;
Class c12=int.class;
Class cl3=Employee.class;
Class cl4=double[].class;
//与e instanceof Employee不同,如果e是某个子类的实例,以下测试将失败
if(ee.getClass()==Employee.class)
{
System.out.println("pass");
}
else System.out.println("fail");
三、反射机制检查类的结构
三个类Field,Method,Constructor分别用于描述类的字段、方法和构造器。而这三个类都有getName方法,返回Field,Method,Constructor的名字
package reflection;
import java.util.*;
import java.lang.reflect.*;
public class ReflectionTest {
public static void main(String[] args) throws ReflectiveOperationException{
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();
}
Class cl=Class.forName(name);
Class supercl=cl.getSuperclass();
String modifiers=Modifier.toString(cl.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
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();
System.out.print("}n");
}
public static void printConstructors(Class cl)
{
Constructor[] constructors=cl.getConstructors();
for(Constructor c:constructors)
{
String name=c.getName();
System.out.print(" ");
String modifiers=Modifier.toString(cl.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
System.out.print(name+"(");
//print parameters types
Class[] paramTypes=c.getParameterTypes();
for(int j=0;j0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printMethods(Class cl)
{
Method[] methods=cl.getMethods();
for(Method m:methods)
{
Class retType=m.getReturnType();
String name=m.getName();
System.out.print(" ");
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
System.out.print(retType.getName()+" "+name+"(");
Class[] paraTypes=m.getParameterTypes();
for(int j=0;j0) System.out.print(",");
System.out.print(paraTypes[j].getName());
}
System.out.println(");");
}
}
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(" ");
String modifier=Modifier.toString(f.getModifiers());
if(modifier.length()>0) System.out.print(modifier+" ");
System.out.println(type.getName()+" "+name+";");
}
}
}
NOTE1
类 Modifier
static String toString(int mod)
返回描述指定修饰符中的访问修饰符标志的字符串。
NOTE2
查看任意对象数据字段的名字和类型
- 获得对应的Class对象
- 在这个Class对象上调用getDeclaredFields



