在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()//以字符串输出修饰符