1:看解释器模式,看到下面的代码
Document doc = null;
//建立一个解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//得到一个表示XML文档的Document对象
doc=builder.parse(filePathName);
//去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象
doc.normalize();
DocumentBuilderFactory为抽象类,抽象类一般是不会去实例化的。
这里的DocumentBuilderFactory.newInstance()是使用了抽象类的static方法去返回一个实例,
可以看源码
public static DocumentBuilderFactory newInstance() {
try {
return (DocumentBuilderFactory) FactoryFinder.find(
/* The default property name according to the JAXP spec */
"javax.xml.parsers.DocumentBuilderFactory",
/* The fallback implementation class name */
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
} catch (FactoryFinder.ConfigurationError e) {
throw new FactoryConfigurationError(e.getException(),
e.getMessage());
}
}
这里返回的是FactoryFinder.find,find方法去查找本地的实例类,我们可以通过代码去看下
public class test{
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
System.out.println(factory);
System.out.println(builder);
System.out.println(document);
}
}
输出结果为
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl@15eb0a9
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl@1a05308
[#document: null]
而DocumentBuilderFactoryImpl则是
public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory{}
DocumentBuilderImpl则是
public class DocumentBuilderImpl extends DocumentBuilder implements JAXPConstants{}
都是实例化的子类。
2:其实抽象类的newInstance方法一般都定义为static的,使用静态方法返回其子类实例的类。这样做一般就是表明它的子类不应该再扩展其他新的方法了,只需要实现这个抽象类声明的方法就够了。比如内部类
public abstract class Abstract {
public static Abstract newInstance() {
return new AbstractImpl();
}
public abstract void method(String s);
protected static class AbstractImpl extends Abstract {
public void method(String s) {
System.out.println(s);
}
}
public static void main(String [] args){
Abstract abs=Abstract.newInstance();
System.out.println(abs);
abs.method("抽象类的newInstance演示");
}
}
运行结果为
com.lxw.test.Abstract$AbstractImpl@757aef
抽象类的newInstance演示
分享到:
相关推荐
Object obj = clazz.newInstance(); Method method = clazz.getMethod("myMethod", String.class); method.invoke(obj, "Hello, Reflection!"); ``` 这段代码展示了如何使用反射动态地创建`MyClass`的对象并调用`...
2. **创建对象**:使用`Class`对象的`newInstance()`方法创建类的新实例,前提是该类有无参构造函数。如果类没有公共构造函数,可以使用`Constructor`类的`getDeclaredConstructor()`和`newInstance()`方法。 3. **...
抽象类中可以包含抽象方法,也可以不包含抽象方法,但这取决于抽象类的设计目的。通常情况下,抽象类是用来提供一种通用行为的基础,而具体实现则留给子类去完成。接下来详细介绍抽象类的相关特性和抽象方法的使用。...
2. 创建对象:通过`Class.newInstance()`创建类的实例,或者使用`Constructor.newInstance()`来指定构造函数参数。 3. 访问字段:`Field`类用于获取和设置类的字段值。 4. 调用方法:`Method`类提供了调用方法的能力...
### 抽象类与抽象方法 #### 内容详情 **摘要:** 本文主要探讨了C#中的抽象类和抽象方法的基本概念、特性和应用场景。通过解析这些概念,旨在帮助读者更好地理解面向对象编程中多态性的实现方式,并掌握如何在实际...
当一个类继承抽象类时,必须实现所有未被父类实现的抽象方法,或者自身也成为抽象类。与抽象类相比,接口更为抽象,它只包含方法签名,没有方法体。接口可以实现多重继承,一个类可以同时实现多个接口。 对象的声明...
例如,`Class.forName("类全名")`用于加载类,`newInstance()`用于创建对象,`getMethod()`、`invoke()`用于调用方法。 以上知识点是Java面试中常见的基础部分,理解和掌握这些内容对于成为一名合格的Java开发者至...
- 实现多态:内部类可以作为抽象类或接口的实现,提供多种不同的实现方式。 4. **内部类与匿名内部类**: 匿名内部类是没有名字的内部类,通常用于快速实现一个简单的接口或抽象类。它们可以用于简化代码,特别是...
- 不能直接创建抽象类的实例,但可以创建一个引用类型为抽象类的变量,并让其指向具体的子类实例。 - 抽象类中可以包含非抽象方法(即已实现的方法),也可以包含抽象方法。抽象方法是在类声明中仅声明方法签名但...
因为没有接口,所以使用 cglib 代理,生成了目标子类的代理对象,代理对象是通过 objenesis.newInstance(proxyClass, enhancer.getUseCache())构造出来的,所以不存在相关属性。 八、总结 由于 AOP 切面代理的原因...
- 抽象类可以有方法实现,可以包含非抽象方法,而接口只能声明方法,不能包含实现。 - 类可以继承一个抽象类,但可以实现多个接口,接口可以继承多个接口。 4. **反射的原理**: - 反射允许程序在运行时检查类的...
- `Class.forName(className).newInstance()`:使用`Class.forName(String className)`来动态加载类,并通过`newInstance()`方法创建对象。这里`className`是从XML文件中读取的,根据配置的不同可以加载不同的工厂类...
Person person = (Person) clazz.newInstance();` - `clone()`方法:如果类实现了`Cloneable`接口,可以调用`clone()`复制对象。 - 序列化和反序列化:对象序列化成字节流,然后再反序列化为新的对象。 10、**...
Class类提供了许多有用的方法,例如newInstance、getMethod、getField等。ClassLoader是Java的类加载器,负责加载类文件。 6. Java IO系统 Java IO系统提供了多种输入/输出流,例如FileInputStream、...
- 反射:通过Class类的newInstance()方法或Constructor类的newInstance()方法动态创建对象。 - clone():如果一个对象实现了Cloneable接口,可以通过调用clone()方法创建对象的副本。 - 反序列化:从磁盘或网络...
** 使用Class类的newInstance()方法或Constructor类的newInstance()方法。 12. **设计模式** - **工厂模式** 提供一个创建对象的接口,使代码更易于维护和扩展。 - **单例模式** 保证一个类只有一个实例,并提供...
5. **处理构造器**:`Constructor`类代表类的构造函数,`Constructor.newInstance()`用于创建类的新实例。 6. **泛型处理**:虽然反射不能直接处理泛型类型信息,但可以通过获取类的实际类型参数来间接实现,例如`...
- 抽象类可以有构造器、抽象方法和非抽象方法,可以有成员变量。 3. Java 创建对象的几种方式: - 使用 new 关键字调用构造方法。 - 使用反射机制。 - 通过 clone() 方法。 - 通过序列化机制。 4. Java 中的...