天天看点

Java学习笔记-反射-分析类的能力

在Java.lang.reflect包中有四个类Class,Constructor,Method以及Field。我们称之为Class类、构造器类、方法类以及域类。其中Class类我们已经说过了,今天我们来谈一谈类的反射中,分析类能力的核心三类Constructor,Method,以及Field类。它们分别用于描述类的构造器、方法以及域。这是Java反射机制的三大核心类。我们还将涉及一个类:Modifier类,我们使用getModifiers()方法获得修饰符,并使用Modifier.toString()以字符串输出修饰符。

Class类中的getFields、getMethods、getConstructors方法分别返回类提供的public域、方法以及构造器数组,如果此类继承于某个超类,同时也包括超类的public部分。

Class类中的getDeclareFields、getDeclareMethods、geDeclaretConstructors方法将返回类中声明的全部域、方法以及构造器数组,其中包括私有和受保护成员,但是不包括超类的成员。

1.Constructor

public static void printConstructors(Class cl){//输出构造器
		Constructor[] constructors=cl.getDeclaredConstructors();//构建构造器类的数组
		for(Constructor c:constructors){//遍历数组
			String name=c.getName();//构造器的名字
			String modifiers=Modifier.toString(c.getModifiers());//返回修饰符
			if(modifiers.length()>0){
				System.out.print(modifiers+" ");
			}
			System.out.print(name+"(");
			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.print(")");
		}
	}
           

重要API:

Constructor[] Class.getDeclaredConstructors()//获得Class类的构造器类数组
int Constructor.getModifiers()//获得构造器类的修饰符(用int表示)
String Modifier.toString()//以字符串输出修饰符
Class[] Constructor.getParameterTypes()//获得构造器类的参数Class类数组
           

2.Method

public static void printMethods(Class cl){//输出方法
	Method[] methods=cl.getDeclaredMethods();//构建方法类的数组
	for(Method c:methods){//遍历数组
		String name=c.getName();//方法的名字
		String modifiers=Modifier.toString(c.getModifiers());//返回修饰符
		if(modifiers.length()>0){
			System.out.print(modifiers+" ");
		}
		System.out.print(name+"(");
		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.print(")");
	}		
}
           

重要API:

Method[] Class.getDeclaredMethods()//获得Class类的方法类数组
int Method.getModifiers()//获得方法类的修饰符(用int表示)
String Modifier.toString()//以字符串输出修饰符
Class[] Method.getParameterTypes()//获得方法类的参数Class类数组
           

3.Field

public static void printFields(Class cl){//输出域
		Field[] fields=cl.getDeclaredFields();//构建域类的数组
		for(Field c:fields){//遍历数组
			String name=c.getName();//域参数的名字
			String modifiers=Modifier.toString(c.getModifiers());//返回修饰符
			if(modifiers.length()>0){
				System.out.print(modifiers+" ");
			}
			System.out.print(name);
		}
	}
           

重要API:

Field[] Class.getDeclaredFields()//获得Class类的域类数组
int Field.getModifiers()//获得域类的修饰符(用int表示)
String Modifier.toString()//以字符串输出修饰符