现在的位置: 首页 > 综合 > 正文

java反射机制

2013年08月10日 ⁄ 综合 ⁄ 共 1454字 ⁄ 字号 评论关闭

    最近在做一个基于SSH+Extjs框架的办公管理系统,感觉办公系统比较简单,model-dao-service-action可以一一对应,于是开始着手做一个可以自动产生系统各种文件的小工具,这样就是省去了绝大多数的敲代码的功夫。

    但是在做工具的时候遇到了一些问题,比如如何得到某个类的的实例,如何得到某个类里面所有的变量及这些变量的类型。我上网查阅资料发现java反射机制是个好东西,用这种机制就可以轻松解决这些问题。     下面我写代码来是详细说明一下怎么使用java的反射来解决我说的这几个问题。     首先怎么根据一个类的名字得到一个类的实例,注意是用类的名字的时候一定要用全名,比如在一个com.test包中有一个类Student,但是你不能认为这个类的名字叫做Student,这里这个类的名字全称应为com.test.Student。好,说了这些之后我们说一下具体怎么操作。         Class是java.lang包中java反射机制类大家族中的一个类,用Class.forName()方法可以得到一个类的实例。比如上一段中的Student类,我们可以这样得到。

package test;

public class Test
{
	public static void main(String[] args)
	{
		try
		{
			Object object = Class.forName("com.test.Student").newInstance();
			Student student = (Student) object;
		}
		catch (ClassNotFoundException e)
		{
			System.out.println("未找到类com.test.Student");
			e.printStackTrace();
		}
		catch (ClassCastException e)
		{
			System.out.println("类型转换失败");
			e.printStackTrace();
		}
		catch (InstantiationException e)
		{
			e.printStackTrace();
		}
		catch (IllegalAccessException e)
		{
			e.printStackTrace();
		}
	}
}

    关于第二个问题,我们可以是用类的getClass().getDeclaredFields()方法得到所有的声明的变量放到一个java.lang.reflect.Field fields[]数组中,我们可以通过调用Field类的getName()方法得到这个变量的名字,用个fields[i].getType()可以得到第i个变量的数据类型,假如我们声明的变量数据类型为int,则getType()方法得到的类型是int,假如我们声明的变量是Date则我们得到的getType类型为class java.util.Date。下面我们用代码来具体实现一下。

package test;

public class Test
{
	public static void main(String[] args)
	{
		TestClass test = new TestClass();
		java.lang.reflect.Field fields[] = test.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length; i++)
		{
			System.out.println(fields[i].getName() + ":" + fields[i].getType());
		}
	}
}

抱歉!评论已关闭.