反射机制中有一个很重要的内容:检查类的结构。
在java.lang.reflect
包中有三个类Field
、Method
和Constructor
分别用于描述类的域、方法和构造器、这三个类都有一个叫做getName
的方法,用于返回项目的名称。Field
类有一个getType
方法,用来返回描述域所属类型的Class
对象。Method
和Constructor
类有能够报告参数类型的方法,Method
类还有一个可以报告返回类型的方法。这三个类还有一个叫做getModifiers
的方法,它将返回一个整形数值,用不同的位开关描述public
和static
这样的修饰符使用情况。另外,还可以利用java.lang.reflect
包中的Modifier
类的静态方法分析getModifiers
返回的整形数值。例如,可以使用Modifier
类中的isPublic
、isPrivate
或isFinal
判断方法或构造器是否是public
、private
或final
。我们需要做的全部工作就是调用Modifier
类的相应方法,并对返回的整数数值进行分析,另外,还可以利用Modifier.toString
方法将修饰符打印出来。
Class
类中的getFields
、getMethods
和getConstructors
方法将分别返回类提供的public
域、方法和构造器数组,其中包括超类的公有成员。Class
类的getDeclareFields
、getDeclareMethods
和getDeclaredConstructors
方法将分别返回类中的声明的全部域、方法和构造器,其中包括私有和受保护成员,但不包括超类的成员。
下面利用上面所提到的知识来通过一个实例来实现打印一个类的全部信息的功能:
public class ReflectionUtils {
/**
* 打印一个类的所有构造方法
*
* @param c class
*/
public static void printConstructors(Class c) {
//返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有构造器
Constructor[] constructors = c.getDeclaredConstructors();
//遍历构造器(构造方法)
for (Constructor constructor : constructors) {
//获取构造方法名
String name = constructor.getName();
System.out.print(" ");
//获取modifiers中位设置的修饰符的字符串表示(public private)
String modifies = Modifier.toString(constructor.getModifiers());
if (modifies.length() > 0) {
System.out.print(modifies + " ");
}
System.out.print(name + "(");
//获取参数类型的Class对象数组
Class[] paramTypes = constructor.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(paramTypes[i].getName());
}
System.out.println(");");
}
}
/**
* 打印一个类的所有方法
*
* @param c class
*/
public static void printMethods(Class c) {
//返回这个类或接口的全部方法,但不包括由超类继承的方法。
Method[] methods = c.getDeclaredMethods();
//遍历方法
for (Method method : methods) {
Class returnType = method.getReturnType(); //方法返回类型
String name = method.getName(); //方法名
System.out.print(" ");
//获取modifiers中位设置的修饰符的字符串表示(public private)
String modifies = Modifier.toString(method.getModifiers());
if (modifies.length() > 0) {
System.out.print(modifies + " ");
}
System.out.print(returnType.getName() + " " + name + "(");
//获取参数类型的Class对象数组
Class[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(paramTypes[i].getName());
}
System.out.println(");");
}
}
/**
* 打印一个类的所有属性
*
* @param c class
*/
public static void printFields(Class c) {
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
Class> type = field.getType();
String name = field.getName();
System.out.print(" ");
//获取modifiers中位设置的修饰符的字符串表示(public private)
String modifies = Modifier.toString(field.getModifiers());
if (modifies.length() > 0) {
System.out.print(modifies + " ");
}
System.out.println(type.getName() + " " + name + ";");
}
}
}
测试类:
public class ReflectionTest {
public static void main(String[] args) {
ReflectionUtils.printConstructors(Double.class);
System.out.println();
ReflectionUtils.printMethods(Double.class);
System.out.println();
ReflectionUtils.printFields(Double.class);
}
}
打印结果:
public java.lang.Double(double);
public java.lang.Double(java.lang.String);public boolean equals(java.lang.Object);
public static java.lang.String toString(double);
public java.lang.String toString();
public int hashCode();
public static int hashCode(double);
public static double min(double, double);
public static double max(double, double);
public static native long doubleToRawLongBits(double);
public static long doubleToLongBits(double);
public static native double longBitsToDouble(long);
public volatile int compareTo(java.lang.Object);
public int compareTo(java.lang.Double);
public byte byteValue();
public short shortValue();
public int intValue();
public long longValue();
public float floatValue();
public double doubleValue();
public static java.lang.Double valueOf(java.lang.String);
public static java.lang.Double valueOf(double);
public static java.lang.String toHexString(double);
public static int compare(double, double);
public static boolean isNaN(double);
public boolean isNaN();
public static boolean isInfinite(double);
public boolean isInfinite();
public static boolean isFinite(double);
public static double sum(double, double);
public static double parseDouble(java.lang.String);public static final double POSITIVE_INFINITY;
public static final double NEGATIVE_INFINITY;
public static final double NaN;
public static final double MAX_VALUE;
public static final double MIN_NORMAL;
public static final double MIN_VALUE;
public static final int MAX_EXPONENT;
public static final int MIN_EXPONENT;
public static final int SIZE;
public static final int BYTES;
public static final java.lang.Class TYPE;
private final double value;
private static final long serialVersionUID;