最近在看《java 核心技术》基础篇中,看到了反射一节。记录下,待后续参考复习;
1、 在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方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受
保护成员,但不包括超类的成员。
例子:
输入:类名称
输出:类的构造器、方法、属性
/**
* @Author: YLBG-YCY-1325
* @Description: 反射
* @Date: 2017/3/31
*/
public class ReflectionTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入类的全称(e.g. java.util.Date):");
String className = scanner.next();
try {
Class cls = Class.forName(className);
Class superClass = cls.getSuperclass();
String modifier = Modifier.toString(cls.getModifiers());
// 获取类前面的修饰符
if (modifier.length() > 0) {
System.out.printf(modifier + " ");
}
System.out.printf("class" + className);
// 超类继承
if (null != superClass && superClass != Object.class) {
System.out.printf(" extends " + superClass.getName());
}
System.out.printf("\n{\n");
printFileds(cls);
System.out.println();
printContructors(cls);
System.out.println();
printMethods(cls);
System.out.println("}");
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
/**
* 打印类的所有构造器
* @param cls 反射类
*/
public static void printContructors(Class cls) {
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
String modifier = Modifier.toString(constructor.getModifiers());
if (modifier.length()>0){
System.out.printf(modifier+" ");
}
System.out.printf(constructor.getName()+"(");
Class[] paramsType = constructor.getParameterTypes();
for (int j=0;j<paramsType.length;j++){
if (j>0){
System.out.printf(",");
}
System.out.printf(paramsType[j].getName());
}
System.out.printf(");\n");
}
}
/**
* 打印所有方法
* @param cls 反射类
*/
public static void printMethods(Class cls){
Method[] methods = cls.getMethods();
for (Method method:methods){
String modifier = Modifier.toString(method.getModifiers());
if (modifier.length()>0){
System.out.printf(modifier+" ");
}
//获取返回类型
Class returnType = method.getReturnType();
System.out.printf(returnType.getName()+" ");
System.out.printf(method.getName()+"(");
//获取参数类型
Class[] paramType = method.getParameterTypes();
for (int i=0;i<paramType.length;i++){
if (i>0){
System.out.printf(",");
}
System.out.printf(paramType[i].getName());
}
System.out.printf(");\n");
}
}
/**
* 打印类的所有属性
* @param cls 反射类
*/
private static void printFileds(Class cls){
Field[] fields = cls.getDeclaredFields();
for (Field field:fields){
String modifier = Modifier.toString(field.getModifiers());
Class fieldType = field.getType();
if (modifier.length()>0){
System.out.printf(modifier + " ");
}
System.out.printf(fieldType+" ");
System.out.printf(field.getName()+";\n");
}
}
}
上面,程序运行结果:
输入类的全称(e.g. java.util.Date):
java.lang.Integer
public final classjava.lang.Integer extends java.lang.Number
{
public static final int MIN_VALUE;
public static final int MAX_VALUE;
public static final class java.lang.Class TYPE;
static final class [C digits;
static final class [C DigitTens;
static final class [C DigitOnes;
static final class [I sizeTable;
private final int value;
public static final int SIZE;
public static final int BYTES;
private static final long serialVersionUID;
public java.lang.Integer(int);
public java.lang.Integer(java.lang.String);
public static int numberOfLeadingZeros(int);
public static int numberOfTrailingZeros(int);
public static int bitCount(int);
public boolean equals(java.lang.Object);
public static java.lang.String toString(int,int);
public java.lang.String toString();
public static java.lang.String toString(int);
public static int hashCode(int);
public int hashCode();
public static int min(int,int);
public static int max(int,int);
public static int reverseBytes(int);
public int compareTo(java.lang.Integer);
public volatile int compareTo(java.lang.Object);
public byte byteValue();
public short shortValue();
public int intValue();
public long longValue();
public float floatValue();
public double doubleValue();
public static java.lang.Integer valueOf(java.lang.String,int);
public static java.lang.Integer valueOf(int);
public static java.lang.Integer valueOf(java.lang.String);
public static java.lang.String toHexString(int);
public static int compare(int,int);
public static java.lang.Integer decode(java.lang.String);
public static int reverse(int);
public static int sum(int,int);
public static int parseInt(java.lang.String);
public static int parseInt(java.lang.String,int);
public static long toUnsignedLong(int);
public static int compareUnsigned(int,int);
public static int divideUnsigned(int,int);
public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);
public static java.lang.Integer getInteger(java.lang.String,int);
public static java.lang.Integer getInteger(java.lang.String);
public static int highestOneBit(int);
public static int lowestOneBit(int);
public static int parseUnsignedInt(java.lang.String);
public static int parseUnsignedInt(java.lang.String,int);
public static int remainderUnsigned(int,int);
public static int rotateLeft(int,int);
public static int rotateRight(int,int);
public static int signum(int);
public static java.lang.String toBinaryString(int);
public static java.lang.String toOctalString(int);
public static java.lang.String toUnsignedString(int);
public static java.lang.String toUnsignedString(int,int);
public final void wait();
public final void wait(long,int);
public final native void wait(long);
public final native java.lang.Class getClass();
public final native void notify();
public final native void notifyAll();
}