反射是一个十分重要的知识点,在J2EE里框架的核心就是反射的知识,经常用Spring框架都把核心知识忘了,所以今天看了《java核心技术I》中关于反射的知识点,记录一下。
能够分析类能力的程序称为 反射(reflective)。
主要用途:
(1)在运行中分析类的能力
(2)在运行中查看对象
(3)实现通过的数组操作代码
(4)利用Method对象
利用反射分析类的能力:它可以检查类的结构。
主要有3个类:Field、Method和Constructor类。分别来描述类的域、方法和构造器。
直接上代码,这是一个可以显示一个类全部信息的程序。
package zjx.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class ReflctionTest {
public static void main(String[] args) {
//从命令行参数或者用户输入来读取 类名
String name;
if(args.length>0) {
name=args[0];
}else{
Scanner in =new Scanner(System.in);
System.out.println("Enter class name (e.g. java.util.Date): ");
name=in.next();
}
//打印类名和父类名字(如果不是Object类)
try {
Class cl=Class.forName(name);
Class supercl=cl.getSuperclass();
String modifiers=Modifier.toString(cl.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
System.out.print("class "+name);
if(supercl != null&&supercl !=Object.class){
System.out.print("extends "+supercl.getName());
}
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);
}
/*
*打印类的所有构造器
*参数 cl 类
*/
public static void printConstructors(Class cl){
Constructor[] constructors=cl.getDeclaredConstructors();
for(Constructor c:constructors){
String name=c.getName();
System.out.print(" ");
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.println(");");
}
}
/*
* 打印类的所有方法
* 参数为cl 类
*
*/
public static void printMethods(Class cl){
Method[] methods=cl.getDeclaredMethods();
for(Method m:methods){
Class retType=m.getReturnType();
String name=m.getName();
System.out.print(" ");
//打印 修饰符 返还类型 和 方法名字
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0)System.out.print(modifiers+" ");
System.out.print(retType.getName()+" "+name+"(");
//打印参数类型
Class[] paramTypes=m.getParameterTypes();
for(int j=0;j<paramTypes.length;j++){
if(j>0)System.out.print(",");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
/*
* 打印类的域
* 参数:cl类
*
*/
public static void printFields(Class cl){
Field[] fields=cl.getDeclaredFields();
for(Field f:fields){
Class type=f.getType();
String name=f.getName();
System.out.print(" ");
String modifiers=Modifier.toString(f.getModifiers());
if(modifiers.length()>0){
System.out.print(modifiers+" ");
}
System.out.println(type.getName()+" "+name+";");
}
}
}
程序运行结果:
Enter class name (e.g. java.util.Date):
java.lang.Double
public final class java.lang.Doubleextends java.lang.Number
{
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 isFinite(double);
public static boolean isInfinite(double);
public boolean isInfinite();
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;
}
输入了java.lang.Double类全名,然后程序分析了类的所有信息,打印了出来。