在Java中能够分析类能力的程序成为反射,反射一般可以用来:
1.在运动中分析类的能力。
2.在运动中查看对象。
3.实现通用的数组操作代码。
4.利用Method对象,类似c++的函数指针。
在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。
这套代码主要是利用java的反射来检查类的结构。
import java.util.*;
import java.lang.reflect.*;
public class ReflectTest
{
public static main(String []args)
{
String name;
if(args.length > 0)
name=args[0];
else{
Scanner in=new Scanner(System.in);
System.out.println("please input a c1ass name(example java.lang.reflect)");
name=in.next();
}
try{
/*Classs是保存每个对象所属类的信息的类
*信息包括类的 field method constructor以及修饰符
*reflect包中有Field Method Constructor分别是描述类的域,方法和构造器。
*/
Class c1=Class.forname(name); //获取类名为name的Class对象。
Class superc1=c1.getSuperclass(); //检查是否有继承
String modifiers=Modifier.toString(c1.getModifiers()); //获取修饰符
if(modifiers.length()>0)
System.out.print(modifiers+" ");
System.out.print("c1ass "+name);
if(superc1!=null && superc1!= Object.c1ass)
System.out.print("extends "+superc1.getName());
System.out.print("\n{\n");
printConstrcutors(c1);
System.out.println();
printMethods(c1);
System.out.println();
printFields(c1);
System.out.println();
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
System.exit(0);
}
public static void printConstrcutors(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+"(");
Class[] parameTypes=c.getParamterTypes(); //返回构造器中的参数类型
for(int j=0;j<parameTypes.length;j++)
{
if(j>0)
System.out.print(", ");
System.out.print(parameTypes[j].getName());
}
System.out.println();
}
}
public static void printMethods(Class c1)
{
Method [] methods=c1.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[] parameTypes=m.getParamterTypes(); //返回方法中的参数类型的Class对象
for(int j=0;j<parameTypes.length;j++)
{
if(j>0)
System.out.print(", ");
System.out.print(parameTypes[j].getName());
}
System.out.println(")");
}
}
public static void printFields(Class c1)
{
Field [] fields=c1.getDeclaredFields();
for(Filed 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+"s;");
}
}
}