java反射中的Class方法

                                      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对象的各种方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值