黑马程序员技术交流社区

标题: Java基础加强中反射Class.newInstance()方法的问题 [打印本页]

作者: 呆萌    时间: 2013-10-17 03:25
标题: Java基础加强中反射Class.newInstance()方法的问题
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
示例:String obj = (String)Class.forName("java.lang.String").newInstance();
张天使老师提到当构造函数是空参数的时候可以使用。
那么如果是有参构造函数的时候呢?是不是在newInstance()括号里面加上参数!?
如果是重载构造函数的话?是不是通过括号里面的参数来区分得到的是哪个构造函数!?
BTW:
Constructor constructir1 = String.class.getConstructor.getConstructor(StringBuffer.class);
String str = (String)congstructor1.newInstance(new Stringbuffer("abc"));
可不可以写成创建Constructor类对象的时候建立泛型,后面不用强转!?
Constructor <String> constructir1 = String.class.getConstructor.getConstructor(StringBuffer.class);
String str = congstructor1.newInstance(new Stringbuffer("abc"));


作者: 雪人    时间: 2013-10-17 06:56
在给Constructor加入泛型后,后面通过反射得到的对象后是不需要强转的,因为实力话出来的对象肯定是

泛型类对象,所以就不用了呗.
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

如果通过反射实例化对象(构造有参数的),要先通过getConstructor()方法,指定参数类型.然后再newInstance()方法中添加参数.比如有个Person类,里面有name,age两个属性,构造里面也需要赋值,那么就应该是
Constructor constructor = clazz.getConstructor(String.class, int.class);
Person p = (Person)constructor.newInstance("name",0);
重载后的构造函数,是通过getConstructor参数类型来匹配的,只有匹配了参数类型,才能进行传参.这样就区分了是哪个构造函数了.


语言组织能力有限,你能读懂最好...读不懂我也没办法...语文不好...

作者: 郑齐育    时间: 2013-10-17 07:36
我们在调用构造函数的时候也是通过传递相应的参数来实现调用指定的构造函数,如果我们传递的参数类型没有与之相对应的构造方法相对应的构造方法时就会报错。你在Constructor类上加入范型只是跟编译器打招呼说,哥们我只接受String的对象,而不能限制构造方法返回的类型。就好比引用不能改变实际的对象一样。
作者: To    时间: 2013-10-17 13:51
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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