在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?
用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。
Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。
例如:
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();
其中AInterface是A的接口,如果下面这样写,你可能会理解:
String className = "A";
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
进一步,如果下面写,你可能会理解:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C , D....等,只要他们继承Ainterface就可以。
从jvm的角度看,我们使用new的时候,这个要new的类可以没有加载;
但是使用newInstance时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forName()方法,这个静态方法调用了启动类加载器(就是加载java API的那个加载器)。
有了上面jvm上的理解,那么我们可以这样说,newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。
[补充:]
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
里面就是通过这个类的默认构造函数构建了一个对象,如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数的权限就抛出IllegalAccessException
转载自网上,网址忘记
分享到:
相关推荐
JAXBContext context = JAXBContext.newInstance(MyObject.class); Marshaller marshaller = context.createMarshaller(); marshaller.marshal(new MyObject(), new File("output.xml")); ``` 3. DOM4J生成:DOM4J...
Java DOM(Document Object Model)是一种基于树形结构的XML文档处理模型,它允许程序员通过对象接口来访问和操作XML文档的各个部分。DOM为XML文档提供了一种内存中的表示方式,使得开发人员可以方便地创建、修改和...
Java 中的 `javax.xml.stream.XMLInputFactory` 和 `javax.xml.stream.XMLOutputFactory` 类用于创建 StAX 解析器和生成器。 2. **读取XML文件** - 使用 DOM:首先,你需要创建一个 `DocumentBuilderFactory` 实例...
可以使用DOM(Document Object Model)或者SAX(Simple API for XML)解析器来生成XML文档。例如,使用DOM解析器创建XML如下: ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();...
在反射机制中,创建对象实例主要依赖于两种方法:`Class`类的`newInstance()`方法和`Constructor`类的`newInstance()`方法。 #### 通过Class实例化对象 当一个类被加载到JVM中时,会创建一个`Class`对象表示这个类...
在Java中,解析XML文件是常见的任务,主要用于读取、修改或生成XML文档。本篇将深入探讨两种主要的XML解析技术:DOM(Document Object Model)和SAX(Simple API for XML)。 DOM解析器将整个XML文档加载到内存中,...
Java提供了多种库来处理XML,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。在使用模板生成XML时,通常会选择DOM或JAXB(Java Architecture for XML Binding),因为...
JAXBContext jaxbContext = JAXBContext.newInstance(MyJavaClass.class); ``` `Marshaller`是JAXB提供的另一个重要接口,用于将Java对象转换为XML格式。通过`Marshaller`,你可以将Java对象转换成XML字符串、写入...
XML(eXtensible Markup Language)是一种用于标记数据的...无论是在配置文件的读取、服务间的通信,还是在XML文档的生成和解析,Java都提供了强大的支持。了解并熟练掌握这些解析方法对于Java开发人员来说至关重要。
标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(xmlFilePath); doc.getDocumentElement()...
在Java中,XML的处理主要包括生成和解析两个方面,而解析又可以进一步细分为DOM和SAX两种主要方式。此外,还有基于StAX(Streaming API for XML)和JAXB(Java Architecture for XML Binding)的方式。 #### 二、...
总的来说,Java生成复杂XML的操作涉及多个层面,包括基本的DOM API、SAX和StAX解析器、XPath和XSLT处理,以及各种辅助库和工具。理解和熟练掌握这些技术,将极大地提升我们在处理XML任务时的效率和灵活性。
- **创建XPath对象**:使用`XPathFactory.newInstance().newXPath()`创建XPath实例。 - **编译XPath表达式**:调用`compile(String expression)`方法将XPath字符串编译成`XPathExpression`对象。 - **执行XPath...
Object instance = compiledClass.newInstance(); Method mainMethod = compiledClass.getMethod("main", String[].class); mainMethod.invoke(instance, (Object)new String[0]); ``` 以上就是Java中动态编译和运行...
JDOM(Java Document Object Model)是一个针对Java平台的API,它提供了对XML文档结构的完整表示,并允许开发者创建、修改和处理XML文档。JDOM的主要优点包括性能、易用性和内存占用效率,使得它成为Java开发人员...
SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); // 如果XML文档包含命名空间,需要启用此选项 SAXParser saxParser = factory.newSAXParser(); ``` 最后,使用`...
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 设置输出...
JAXBContext jaxbContext = JAXBContext.newInstance(User.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); User user = (User) unmarshaller.unmarshal(new File("user.xml")); ``` 在这个...
Object instance = compiledClass.newInstance(); // 调用方法或执行其他操作 } ``` 9. **关闭文件管理器** 最后,别忘了关闭文件管理器以释放资源。 ```java fileManager.close(); ``` 总结来说,Java的...