Java反射这一部分主要是和Java.lang.reflect打交道。所以这个包里面的一些类需要研究一下,本节讲述了Java中用反射分析类的能力的问题
这里面经常遇到的三个类是 Method、Field、Constructor 分别是反射机制中的方法,属性,构造器
还有一个类是下面用的到的Modifier ,这是一个用来管理修饰符,关键字等符号的类,比如public,private,static,final,volatile,protected,synchronized等等等。
有一个toString(int mod)方法,原理是用参数和上述表示上述关键字的常量按位与&,返回相应的结果。同时这个类里面也包括了一些判断是否是上述关键字的方法
比如 isAbstract(),isStatic(),isPublic()等等
下面代码说明了java利用反射分析类的能力的实现方法,代码有点长,请读者耐心看完。
public final class ReflectTest {
private static Scanner sc;// 输入流
public static void showConstructor(Class c) {
System.out.println("构造方法如下:");
Constructor constructor[] = c.getDeclaredConstructors();//获得本类中的所有构造方法
// Constructor constructor[] = c.getConstructors();//
for (Constructor temp : constructor) {
String str = Modifier.toString(temp.getModifiers());// 我是才发现,这个Modifier类里面,每一个都是静态方法
System.out.print(" ");
if (str.length() > 0)// 其实内部是返回的一个StringBuilder类型的变形,如果有修饰符则返回对应的toString,否则返回"";
System.out.print(str + " ");
System.out.print(temp.getName() + "(");
Class parm[] = temp.getParameterTypes();
int num = 0;
for (Class t : parm) {
if (num > 0) {
System.out.print(", " + t);
} else {
System.out.print(t);
}
num++;
}
System.out.println(");");
}
}
public static void showField(Class c) {
System.out.println("属性如下:");
Field field[] = c.getDeclaredFields();//返回这个类中所有的方法,是所有的!
// Field field[] = c.getFields();//返回这个类中的所有的方法,和其父类的所有非私有方法
for (Field f : field) {
String str = Modifier.toString(f.getModifiers());
if (str.length() > 0)//同上
System.out.print(" " + str + " ");
System.out.println(f.getType().getName() + " " + f.getName() + ";");
}
}
public static void showMethod(Class c) {
System.out.println("方法如下:");
Method method[] = c.getDeclaredMethods();
for (Method m : method) {
String str = Modifier.toString(m.getModifiers());
System.out.print(" ");
if (str.length() > 0)
System.out.print(str + " ");
System.out.print(m.getReturnType().getName() + " " + m.getName()
+ "(");
Class parm[] = m.getParameterTypes();// 获取所有参数Class对象
int num = 0;
for (Class p : parm) {
if (num > 0) {
System.out.print(", " + p.getName());
} else {
System.out.print(p.getName());
}
}
System.out.print(")");
Class exc[] =m.getExceptionTypes();//如果方法有异常声明,则返回这个方法所有声明的异常的Class对象
num=0;
for(Class t:exc){
if(num>0){
System.out.print(", "+t.getName());
}else{
System.out.print("throws "+t.getName());
}
}
System.out.println(";");
}
}
public static void main(String[] args) throws ClassNotFoundException {
sc = new Scanner(System.in);
System.out.println("输入类名:");
String className = "com.reflect.text.ReflectTest";
// String className = sc.next();
Class c = Class.forName(className);
String modifierName = Modifier.toString(c.getModifiers());
if (modifierName.length() > 0)
System.out.print(modifierName + " ");
System.out.print(className);
Class cs = c.getSuperclass();
System.out.println(" extends " + cs.getName() + "{");
showConstructor(c);
showField(c);
showMethod(c);
}
}
上述代码用到了一些方法,现在简单介绍一下上面一些重要的方法。
Field[] getFields()
Field[] getDeclaredField()
前者可以获得一个类的所有属性,包括父类的共有属性,后面只获得它本身的属性
Constructor[] gerConstructors()
Constructor[] gerDeclaredConstructors()
返回所有的构造器
Method[] getMethods()
Method[] getDeclaredMenthods()
返回所有其本身的方法,包括父类的共有方法,后者指返回它本身的所有方法,是所有!
Class getDeclaringClass()
返回包含这个属性,或方法,或构造器的类的Class对象
Class[] getExceptionTypes()
返回这个方法所有已经声明异常类型的数组
int getModifiers()
返回这个类或者方法或者构造方法或者属性修饰符的整数类型
String getName()
通用,好多类都有这个方法,Class Modifier Field Method Constructor等 都包含,分情况而已。
Class[] getParamertypes()
返回参数类型的Class数组,
Class getReturnType()
返回方法的返回值类型