利用java反射分析类的能力


在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;");
			
			}
	}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值