黑马程序员技术交流社区

标题: 反射 [打印本页]

作者: 林国锋    时间: 2011-10-9 12:14
标题: 反射
请问反射中有哪几个类是有newInstance()方法的?

请问newInstance()方法是用来做什么的?
作者: 石宗银    时间: 2011-10-9 12:21
Class、 Constructor有
newInstance(), 返回一个类的新实例对象
作者: 成杰    时间: 2011-10-9 12:23
作用是创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型实例对象


作者: 黄治文    时间: 2011-10-9 12:26
newInstance()方法在反射中通常用于已知一份字节码,然后通过该字节码创建字节码对象所表示的类的一个实例对象。
只要该字节码对应的类中有一个无参的构造函数,都可以使用newInstance()方法创建一个类的实例对象
作者: 林国锋    时间: 2011-10-9 12:32
黄治文 发表于 2011-10-9 12:26
newInstance()方法在反射中通常用于已知一份字节码,然后通过该字节码创建字节码对象所表示的类的一个实例 ...

newInstance() 可不可以调用有参的构造方法
如:String str = (String)xx.newInstance("abc");
作者: 黄治文    时间: 2011-10-9 12:39
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的,我用实际代码试试看吧
作者: 黄治文    时间: 2011-10-9 12:42

作者: 黄治文    时间: 2011-10-9 12:44

确实是不行的
作者: 黄治文    时间: 2011-10-9 12:57
其实成杰兄上面的也是正确的,因为总共有这么多类拥有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()
其中具体的方法得要靠楼主自己摸索使用了
作者: 林国锋    时间: 2011-10-9 15:41
黄治文 发表于 2011-10-9 12:57
其实成杰兄上面的也是正确的,因为总共有这么多类拥有newInstance()方法,
com.sun.jdi.ArrayType.newInsta ...

好的,谢谢




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