此文章已于 10:49:32 2008-11-26 发布到 chandlersong的个人空间
反射
类别 Java 技术
对反射概念的形成是源自于《大话设计模式》这本书,这本书使用.NET来写的。讲反射是因为说明通过反射可以用一个String的区别,就可以实例化不同的类。也就因此,我对于反射的映像就是用来这个的。
最近在看《core java》这本书,对反射有了一定的认识。其实反射,最简单的应用是分析类。基本涉及的几个类是lang包Class<T>,以及java.lang.reflect包下的几个类。
Java.lang.reflect包下的类名都很好理解,看看API就能明白。这里就是OO的思想的体现了,在探索类名的时候,被探索的方法,成员这些都被分装入一个一个类中,以方便的使用。
接下来,是如果用反射来实例化一个对象的方法。
- public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
- Class<?> cls;
- Constructor<?> cons;
- cls = Class.forName("java.lang.String"); //确定类名
- Class<?>[] argclass = new Class[1]; //参数名称数组
- argclass[0]= Class.forName("java.lang.String"); //参数类名
- Object[] arg = new Object[1]; //参数数组
- arg[0] = "success"; //参数
- cons = cls.getConstructor(argclass); //传入参数类名
- String a = (String)cons.newInstance(arg); //传入参数,并且实例化
- System.out.println(a); //打印
- }
整段代码是这样来进行的。首先,实例化一个Class对象和Constructor对象,分别代表你要实例化的对象以及其构造函数。如果说你要实例化的对象的构造函数是没有参数的。那么直接cls.newInstance()就可以了。
然后就是确定你要实例化类的构造函数到底用哪一个了。构造函数只是一个比较特殊的函数。而在java中区别方法的通过区别方法名和参数类型来确定的。构造函数的方法名确定了。那么接下来就是通过参数类型了。这里,装载参数类型的数组就是argClass(因为我用的String有一个String为参数的构造函数,所以这里的数组只有一项)。
接下来,就是调用cons的产生对象的方法,并且把参数数组arg传入进去了。