在初始化一个类,生成一个实例的时候;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() 方法则是 Class类的一个方法,用于创建一个新的对象。例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用...
- **newInstance()方法**:这是`java.lang.Class`类中的一个方法,用于根据给定的`Class`对象实例化一个新的对象。此方法会调用相应类的无参构造函数来创建实例。 - **new关键字**:这是Java中的一个保留关键字,...
在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...
Point point = (Point) constructor.newInstance(10, 20); System.out.println("Point created with coordinates (" + point.x + ", " + point.y + ")"); } catch (Exception e) { e.printStackTrace(); } ``` 8...
我们可以使用class literal来获取类的元数据,如类名、接口实现、父类等,也可以用于创建类的新实例(通过`newInstance()`方法,前提是该类有无参构造器)。 接着,我们讨论 "instance.getClass()"。这个方法是每个...
JavaSE062Class类、Method类及Field类是Java中三个非常重要的类,它们都是Java反射机制的核心组件。在Java中,反射机制是指可以在运行时检查和修改类、方法、变量等成员的行为。下面我们将深入探析这三个类的使用...
相比之下,`newInstance()`方法是`java.lang.Class`类的一个方法,它依赖于反射机制来创建对象。反射允许程序在运行时动态地获取类的信息并操作类的对象。使用`newInstance()`的方法流程如下: 1. 类加载与链接:与...
2. newInstance():可以为类创建一个实例,这个方法调用默认构造器(无参数构造器)初始化新建对象。 3. getClassLoader():返回该类的类加载器。 4. getComponentType():返回表示数组组件类型的Class。 5. ...
Class.forName()方法和newInstance()方法是Java语言中两个重要的机制,它们可以实现类的加载和实例化。它们的使用可以提高代码的灵活性和可维护性,但是也需要注意它们的缺点和限制。 知识点: 1. Class.forName()...
需要注意的是,`newInstance` 方法只能调用无参构造器,如果类中没有默认的无参构造器,那么将抛出 `InstantiationException` 异常。此时可以使用 `Class.getDeclaredConstructor` 和 `Constructor.newInstance` ...
Object obj = clazz.newInstance(); System.out.println(obj.getClass().getName()); // 输出:org.whatisjava.reflect.Foo } catch (ClassNotFoundException | InstantiationException | IllegalAccessException...
- **`public T newInstance()`**:根据`Class`对象所对应的类类型新建一个类实例。此方法常用于反射中创建对象和调用对象的方法。例如: ```java Class doubleClass = Class.forName("java.lang.Double"); Object...
在“java_innerclass_instance.rar_innerclass”这个压缩包中,包含的资源可能是一个关于Java内部类实例应用的示例代码。 内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。这里我们主要...
- **创建对象**:`Class`对象提供了`newInstance()`方法,用于创建类的新实例(前提是没有参数的构造函数)。 - **获取类的成员信息**:可以获取类的字段(`getFields()`)、方法(`getMethods()`)和构造器(`...
9. **实例化对象**:通过Class对象,可以使用`newInstance()`方法动态创建类的实例,前提是没有默认构造器或者构造器没有参数。 10. **方法的访问**:Class对象提供了`getMethod()`、`getDeclaredMethod()`等方法,...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...
这里使用了`Class.forName("TestClass")`方法显式地加载`TestClass`类,并通过`newInstance()`方法创建实例。这种方法比默认加载过程更为灵活,可以在运行时动态地加载类。 ##### 示例3:自定义类加载器加载过程 `...
一旦获取到`Class`对象,你可以进一步使用`newInstance()`方法创建该类的实例。`newInstance()`会调用类的无参数构造器来创建对象,类似于`new MyClass()`。但是,如果类没有无参构造器或者构造器是私有的,`new...
- `newInstance()`:调用Class对象的`newInstance()`方法能创建目标类的实例,但前提是类必须有无参构造器,并且可访问。返回的是`Object`类型,需要强制转换。 - **泛型Class引用**:使用泛型Class引用可以创建...
- `newInstance()`:创建类的新实例,但只适用于有默认构造函数的类。 除了通过 `obj.getClass()` 获取对象的类信息外,我们还可以使用类字面量(如 `Foo.class`)来获取指定类型的 `Class` 对象。类字面量允许我们...