黑马程序员技术交流社区

标题: 反射,想不通 [打印本页]

作者: 杜佳瑞    时间: 2012-8-18 01:30
标题: 反射,想不通
import java.lang.reflect.Constructor;
public class ReflectTest {
        public static void main(String[] args)throws Exception {
                Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
                String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
                System.out.println(constructor1.toString());
        }
}
反射到底有什么用???也在网上看了很多相关的问题,但是觉得没有一个能真正理解的。反射就是程序能够自检查自身信息。在程序中可以检查某个类中的方法属性等信息,并且能够动态调用。这样可以写出很灵活的程序。
这句话看到的最多,可是光有文字很难理解具体什么时候用能体现它的价值。就比如说上面的程序,就创建一个字符串对象,用那么费劲吗?既然开始就知道对象是StringBuffer类型,为什么不用String str=new String(new StringBuffer("abc"))呢?那为什么还要用constructor方法特地绕一圈回来在求StringBuffer呢?

作者: 周世阳    时间: 2012-8-18 02:15
如果现在给你一个要求建立一个类的实例,这个实例需要往构造方法需要传入一个StringBuffer对象,类名不告诉你,待定,可能是各种类名,到时候会用资源文件标注需要建立实例的类名,这种情况下不用反射是无法完成的
作者: 程有愿    时间: 2012-8-18 07:05
反射在以后的框架里面有体现,真因为他的灵活性才被应用!
作者: 童兴龙    时间: 2012-8-18 07:59
对头,反射如果你了解了,对框架就更容易掌握。因为框架都是运用反射技术来写的。
作者: 杜佳瑞    时间: 2012-8-18 10:20
本帖最后由 杜佳瑞 于 2012-8-18 10:21 编辑
周世阳 发表于 2012-8-18 02:15
如果现在给你一个要求建立一个类的实例,这个实例需要往构造方法需要传入一个StringBuffer对象,类名不告诉 ...


像你说的开始不知道类名,需要反射得到这个类的构造函数才能创建该类的实例对象,很显然我们已经知道该类是String了!Constructor constructor1 = String.class.getConstructor(StringBuffer.class);而另一种得到Class对象的方法也是在知道该类的类名的前提下呀 Constructor constructor1 =Class.forName("java.lang.String").getConstructor(StringBuffer.class);
还是想不通,是不是我现在刚接触很正常呢?希望再给我讲解讲解。能帮找一个小的实例吗?不要太长,容易理解你说的这种情况的。谢谢啦!
作者: 周世阳    时间: 2012-8-18 10:37
杜佳瑞 发表于 2012-8-18 10:20
像你说的开始不知道类名,需要反射得到这个类的构造函数才能创建该类的实例对象,很显然我们已经知道该类 ...

你不知道类名的情况下例子应该时这样,类里面的反射语句为
String className;
Constructor constructor1 =Class.forName(className).getConstructor(StringBuffer.class);
这个className字符串变量是通过运行参数或者资源文件中读取的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2