java反射中的Class方法
java中有一种特殊的Class类,Class类记录了class类的类信息,如class的成员函数,成员方法等。
通过反射,我们可以得到类的Class信息,然后可以用Class对象的调用方法查看类的各种信息。
这么说有点绕,我们来简单实现以下了解下反射的实现方法:
java父类:
package LaboratoryReport;
public class Test {
public void tt() {
}
public int a;
public Test(int a) {
this.a=a;
}
}
java子类:
package LaboratoryReport;
import java.lang.reflect.*;
import java.util.Scanner;
public class ReflectionTest extends Test{
public ReflectionTest(int a) {
super(a);
}
public String age;
public static void main(String[] args) {
// TODO Auto-generated method stub
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="LaboratoryReport.ReflectionTest";
}
try {
Class cl=Class.forName(name);
Class supercl=cl.getSuperclass();
String modifiers=Modifier.toString(cl.getModifiers());
if(modifiers.length()>0)System.out.println(modifiers+"");
System.out.println("class"+name);
if(supercl!=null&&supercl!=Object.class)System.out.println("extends"+supercl.getName());
System.out.println("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
System.exit(0);
}
public static void printConstructors(Class cl){
Constructor[] constructors=cl.getConstructors();
for(Constructor c:constructors)
{
String name=c.getName();
System.out.println(" ");
String modifiers=Modifier.toString(c.getModifiers());
if(modifiers.length()>0)
System.out.println(modifiers+"");
System.out.println(name+"(");
Class[] paramTypes=c.getParameterTypes();
for(int j=0;j<paramTypes.length;j++)
{
if(j>0)
System.out.println(",");
System.out.println(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printMethods(Class cl)
{
Method[] methods= cl.getMethods();
for(Method m:methods)
{
Class retType= m.getReturnType();
String name=m.getName();
System.out.println(" ");
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0)
System.out.println(modifiers +" ");
System.out.println(retType.getName()+" "+name+"(");
Class[] paramTypes=m.getParameterTypes();
for(int j = 0;j<paramTypes.length;j++)
{
if(j>0)
System.out.println(", ");
System.out.println(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printFields(Class cl) {
Field[] fields=cl.getFields();
for(Field f:fields)
{
Class type=f.getType();
String name=f.getName();
System.out.println(" ");
String modifiers=Modifier.toString(f.getModifiers());
if(modifiers.length()>0)
System.out.println(modifiers+" ");
System.out.println(type.getName()+" "+name+";");
}
}
}
执行结果:
上面是函数的执行结果,
解释下Class的各个函数
getClassName():获取类的名字(包括包名),返回字符串。
getName():获取某个构造器,方法或者域名的名称,返回字符串。
getConstructors():返回Class对象所描述的类的公有构造器的数组。
getMethods():返回Class对象所描述的类的公有方法和从父类继承的方法组成的数组。
getDeclareMethods():返回Class对象所描述的类的公有方法组成的数组。
getField():返回描述的类的公有方法和其父类的公有方法组成的数组。
getDeclareField():返回描述的类的公有方法组成的数组。
getParametertypes()(在Constructors或者Methods类中用):返回描述参数类型的Class对象数组。
getReturnrtype()在Methods类中用):返回描述参数返回类型的Class对象。
上面的getConstructors()、getMethods()、getField()等方法返回的数组都是对应的类的对象数组:以getField()
方法为例,类的每个域都会在实例化之后存放在new出来的Field对象。然后返回由多个Field对象组成的Field数组。
至于Field对象获取到之后怎么用,我在另一篇博客里有介绍:java通过反射获取的Field得到类实例的域信息
这里主要介绍下Class对象的各种方法。