1.什么是反射?
反射是能够分析类能力的程序,JAVA通过反射库提供了一个非常丰富且精心设计的工具集。这项功能被大量应用于JavaBean中,是Java组件的体系结构。
2.反射的功能?
- 在运行中分析类的能力。
- 在运行中查看,例如,编写一个toString方法供所有类使用
- 实现通用的数组操作代码
- 利用Method对象
3.Class类及常用API
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型表示。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的执行方法。
然而,可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class。
Class常用API有:
static Class forName(String className)
返回描述雷鸣为className的Class对象
4.利用反射分析类的能力
在java.lang.reflect包中有三个类Field、Method和Constructor分别用于描述类的变量、方法、构造器。这三个类都使用getName的方法来返回项目的名称,Field类用getType方法来返回所属类型的Class对象。另外这三个类还有一个getModifiers方法通过返回一个整形数值,用不同的位开关来描述访问修饰符。
Modifier类中的isPublic、isPrivate或isFinal判断方法或构造器是否是Public、private或final。还可以利用Modifier.toString方法将修饰符打印出来。
下面通过一个打印一个类的全部信息的Demo来演示以上方法的使用
reflectTools代码如下:
class ReflectTools {
/**
* 打印构造函数
* @param c1 类
*/
@SuppressWarnings("rawtypes")
public static void printConstructors(Class c1){
Constructor[] constructors = c1.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+" "+"(");
//print parameters types
Class[] paramTypes=c.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 c1 类
*/
@SuppressWarnings("rawtypes")
public static void printMethods(Class c1){
Method[] methods =c1.getDeclaredMethods();
for(Method m:methods){
String name=m.getName();
System.out.print(" ");
Class retType=m.getReturnType();
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0)
System.out.print(modifiers+" ");
System.out.print(retType+" "+name+"(");
//print parameter Types
Class[] paramTypes=m.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 c1 类
*/
public static void printFields(Class c1){
Field[] fields = c1.getDeclaredFields();
for(Field f :fields){
String name=f.getName();
Class type=f.getType();
System.out.print(" ");
String modifiers=Modifier.toString(f.getModifiers());
if(modifiers.length()>0)
System.out.print(modifiers+" ");
System.out.println(type.getName()+" "+name+";");
}
}
}
reflectTest代码如下:
public class ReflectTest {
/**
* @param args
*/
@SuppressWarnings({ "rawtypes", "resource", "unused" })
public static void main(String[] args) {
String name;
if(args.length>0){
name=args[0];
}else{
Scanner sc = new Scanner(System.in);
System.out.println("Enter class name(e.g java.util.Date)");
name=sc.next();
}
try{
//print class name and super class name
Class c1=Class.forName(name);
Class superc1=c1.getSuperclass();
String modifiers =Modifier.toString(c1.getModifiers());
if(modifiers.length()>0)
System.out.print(modifiers+" ");
System.out.print("class "+name);
if(superc1!=null && superc1!=Object.class){
System.out.print(" extends "+superc1.getName());
}
System.out.print("\n{\n");
//constructors
ReflectTools.printConstructors(c1);
System.out.println();
//methods
ReflectTools.printMethods(c1);
System.out.println();
//fields
ReflectTools.printFields(c1);
System.out.println("}");
}catch(Exception e){
e.printStackTrace();
}
}
}
以上仅为基础学习笔记,如有问题请帮忙指正,谢谢!