java反射机制

来源:互联网 发布:mysql5.7 修改端口号 编辑:程序博客网 时间:2024/06/06 12:36
    最近在做一个基于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());}}}

原创粉丝点击