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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林国锋 黑马帝   /  2011-10-9 12:14  /  2322 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问反射中有哪几个类是有newInstance()方法的?

请问newInstance()方法是用来做什么的?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

9 个回复

倒序浏览
Class、 Constructor有
newInstance(), 返回一个类的新实例对象
回复 使用道具 举报
作用是创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型实例对象

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
newInstance()方法在反射中通常用于已知一份字节码,然后通过该字节码创建字节码对象所表示的类的一个实例对象。
只要该字节码对应的类中有一个无参的构造函数,都可以使用newInstance()方法创建一个类的实例对象
回复 使用道具 举报
newInstance
public T newInstance()
              throws InstantiationException,
                     IllegalAccessException创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。
注意,此方法传播 nullary 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。


返回:
此对象所表示的类的一个新分配的实例。
抛出:
IllegalAccessException - 如果此类或其 nullary 构造方法是不可访问的。
InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 nullary 构造方法; 或者由于某种其他原因导致实例化过程失败。
ExceptionInInitializerError - 如果该方法引发的初始化失败。
SecurityException - 如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例
调用方的类加载器不同于也不是该类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包
我看着JDK,JDK说是不行的,我的JDK版本是1.5的,我用实际代码试试看吧
回复 使用道具 举报
其实成杰兄上面的也是正确的,因为总共有这么多类拥有newInstance()方法,
com.sun.jdi.ArrayType.newInstance(int)
com.sun.jdi.ClassType.newInstance(com.sun.jdi.ThreadReference, com.sun.jdi.Method, java.util.List, int)
java.lang.Class.newInstance()
java.lang.reflect.Array.newInstance(java.lang.Class, int)
java.lang.reflect.Array.newInstance(java.lang.Class, int[])
java.lang.reflect.Constructor.newInstance(java.lang.Object...)
java.net.URLClassLoader.newInstance(java.net.URL[])
java.net.URLClassLoader.newInstance(java.net.URL[], java.lang.ClassLoader)
java.rmi.activation.ActivationGroup_Stub.newInstance(java.rmi.activation.ActivationID, java.rmi.activation.ActivationDesc)
java.rmi.activation.ActivationInstantiator.newInstance(java.rmi.activation.ActivationID, java.rmi.activation.ActivationDesc)
java.security.KeyStore.Builder.newInstance(java.lang.String, java.security.Provider, java.io.File, java.security.KeyStore.ProtectionParameter)
java.security.KeyStore.Builder.newInstance(java.lang.String, java.security.Provider, java.security.KeyStore.ProtectionParameter)
java.security.KeyStore.Builder.newInstance(java.security.KeyStore, java.security.KeyStore.ProtectionParameter)
java.security.Provider.Service.newInstance(java.lang.Object)
javax.naming.ldap.InitialLdapContext.newInstance(javax.naming.ldap.Control[])
javax.naming.ldap.LdapContext.newInstance(javax.naming.ldap.Control[])
javax.xml.datatype.DatatypeFactory.newInstance()
javax.xml.parsers.DocumentBuilderFactory.newInstance()
javax.xml.parsers.SAXParserFactory.newInstance()
javax.xml.transform.TransformerFactory.newInstance()
javax.xml.validation.SchemaFactory.newInstance(java.lang.String)
javax.xml.xpath.XPathFactory.newInstance()
javax.xml.xpath.XPathFactory.newInstance(java.lang.String)
org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance()
org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance()
我刚才说的是:
java.lang.Class.newInstance()
其中具体的方法得要靠楼主自己摸索使用了

评分

参与人数 1技术分 +2 黑马币 +4 收起 理由
admin + 2 + 4 很热心的童鞋!

查看全部评分

回复 使用道具 举报
林国锋 黑马帝 2011-10-9 12:32:25
7#
黄治文 发表于 2011-10-9 12:26
newInstance()方法在反射中通常用于已知一份字节码,然后通过该字节码创建字节码对象所表示的类的一个实例 ...

newInstance() 可不可以调用有参的构造方法
如:String str = (String)xx.newInstance("abc");

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黄治文 黑马帝 2011-10-9 12:44:01
8#

确实是不行的
回复 使用道具 举报
黄治文 黑马帝 2011-10-9 12:42:10
9#
回复 使用道具 举报
黄治文 发表于 2011-10-9 12:57
其实成杰兄上面的也是正确的,因为总共有这么多类拥有newInstance()方法,
com.sun.jdi.ArrayType.newInsta ...

好的,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马