A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-8-18 01:30  /  1508 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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呢?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
杜佳瑞 发表于 2012-8-18 10:20
像你说的开始不知道类名,需要反射得到这个类的构造函数才能创建该类的实例对象,很显然我们已经知道该类 ...

你不知道类名的情况下例子应该时这样,类里面的反射语句为
String className;
Constructor constructor1 =Class.forName(className).getConstructor(StringBuffer.class);
这个className字符串变量是通过运行参数或者资源文件中读取的
回复 使用道具 举报
本帖最后由 杜佳瑞 于 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);
还是想不通,是不是我现在刚接触很正常呢?希望再给我讲解讲解。能帮找一个小的实例吗?不要太长,容易理解你说的这种情况的。谢谢啦!
回复 使用道具 举报
对头,反射如果你了解了,对框架就更容易掌握。因为框架都是运用反射技术来写的。
回复 使用道具 举报
反射在以后的框架里面有体现,真因为他的灵活性才被应用!
回复 使用道具 举报
如果现在给你一个要求建立一个类的实例,这个实例需要往构造方法需要传入一个StringBuffer对象,类名不告诉你,待定,可能是各种类名,到时候会用资源文件标注需要建立实例的类名,这种情况下不用反射是无法完成的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马