您的当前位置:首页正文

Java利用反射机制分析类的能力

2024-11-11 来源:个人技术集锦

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()
返回方法的返回值类型

综上,反射这一块就是有点杂,不太好捋顺清楚,蛋疼的很,希望啰嗦了这么多能有一定的价值,帮助大家。


Top