黑马程序员技术交流社区

标题: 关于反射创建实例对象 [打印本页]

作者: 小路飞    时间: 2013-3-28 11:40
标题: 关于反射创建实例对象
本帖最后由 侯国奇 于 2013-3-29 10:28 编辑
  1. InputStream ips = ReflectTest2.class.getResourceAsStream("config.properties");
  2. Properties props = new Properties();
  3. props.load(ips);
  4. ips.close();
  5. String className = props.getProperty("className");
  6. Collection collections = (Collection)Class.forName(className).newInstance(); //创建实例对象

  7. /*

  8. config.properties中的内容为:
  9. className=java.util.ArrayList

  10. 想问问上面创建实例对象的方式和
  11. 获取类的构造方法(Constructor)之后再创建实例对象有什么区别?

  12. Constructor constructor = ArrayList.class.getConstructor();
  13. Collection collections = (Collection)constructor.newInstance();
  14.                
  15. */
复制代码
谢谢了!




作者: 李尧    时间: 2013-3-28 11:43
没区别吧,反射就是用来写框架的.
作者: 张豪杰    时间: 2013-3-28 11:52
区别不大-。-
实际上
Properties props = new Properties();
props.load(ips);
ips.close();
这段代码只是在加载配置文件,也就是说,你要从config.properties中获取到你要用的信息,也就是className
这样你就知道配置文件中你需要加载的类名了
接下来就是通过类名获取字节码,然后是创建实例对象了。
需要注意的是:Collection collections = (Collection)Class.forName(className).newInstance();//这里是使用Class类里面的newInstance方法,调用没有参数的构造函数直接创建实例对象。
Constructor constructor = ArrayList.class.getConstructor();
Collection collections = (Collection)constructor.newInstance();
而这两句是先通过构造器获取构造函数,然后在用Constructor里面的方法创建实例对象。
第一种方式实际上是简化了操作,但是他只能获取没有参数的构造函数。如果要反射的类中没有空参数的构造函数,是不能使用Class里面的newInstance()方法的。
作者: 小路飞    时间: 2013-3-28 14:32
张豪杰 发表于 2013-3-28 11:52
区别不大-。-
实际上
Properties props = new Properties();

原来如此啊,谢谢仁兄!




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