不使用new运算符实例化对象

问题描述 投票:9回答:8

在一次java访谈中,提出以下问题:

在java中有没有一种方法来实例化一个对象而不使用new运算符?我回答他说没有其他的实例化方法。但是他问我如何使用java中的xml文件(在spring框架中)中的配置来实例化java中的对象。我说,内部弹簧使用reflection utils创建一个new运算符的对象。但面试官并不相信我的回答。

我看到this link很有用但是有一个new操作员间接参与了一个或另一个内部方法。

有没有办法在不使用new运算符的情况下在java中实例化对象?

java xml new-operator objectinstantiation
8个回答
10
投票

你可以使用Java Reflection API来做到这一点。这就是Spring框架的DI工作原理(从xml实例化对象)。

Class<YourClass> c = YourClass.class;
YourClass instance = c.newInstance();

另外,考虑到enumspecial class,枚举的实例是在不使用new算子的情况下创建的。

public enum YourEnum { X, Y }

9
投票

以下形式的数组初始值设定项不明确使用new

int ia[][] = { {1, 2}, null };

这通过自动装箱创建了一个对象:

Integer big = 9999;

最后,以下结果是在程序生命周期的某处创建对象:-)

Class c = ThisClass.class;
String s = "a literal";
enum SomeEnum { WON, CHEW, TREE }

(使用库方法或本机代码有许多方法可以做到这一点)


在封面下,纯Java中任何新对象的创建都涉及new字节码或3个new array字节码之一。这可能包括我的所有例子。

有趣的是,Object.clone()ObjectInputStream.readObject()都使用“魔术”机制来创建不涉及上述字节码的实例,并且不以正常方式调用构造函数。


6
投票

你可以使用jdbc的方式

Class.forName("YOURCLASSNAME").newInstance()

2
投票

您可以使用clone方法创建没有new运算符的对象副本。

clone用于制作对象的副本。在使用Object的clone方法时,您应该记住某些事项。

  • 为要克隆的每个类实现“Cloneable”接口。如果一个类没有实现“Cloneable”接口,clone方法将抛出“CloneableNotSupportedException”。此接口不包含任何方法。它只是一个标记界面。

String类的示例

String sample = new String();

现在我们不打算使用new运算符,我们将创建一个新对象

String sampleClone = sample.clone();

其他你可以使用Class.forName()

public static Class forName(String className)抛出ClassNotFoundException

返回与具有给定字符串名称的类或接口关联的Class对象。

示例 - 类exampleClass = Class.forName(yourtClass);

阅读官方文档

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName%28java.lang.String%29


1
投票
   import java.io.FileInputStream;
   import java.io.FileOutputStream;
   import java.io.ObjectInputStream;
   import java.io.ObjectOutputStream;
   import java.io.Serializable;

   public class ObjectCreateDifferentWays {

       public static void main(String[] args) throws Exception {
           ///1st Way with newInstance()
           Class cls = Class.forName("Student");
           Student ob1 = (Student) cls.newInstance();
           ob1.display();

           ///2nd Way with new Operator
           Student ob2 = new Student();
           ob2.display();

           //3rd Way with clone
           Student ob3 = (Student) ob2.clone();
           ob3.display();


           //4th Way with Deserialization
           FileOutputStream out = new FileOutputStream("file.txt");
           ObjectOutputStream obOut = new ObjectOutputStream(out);
           obOut.writeObject(ob2);
           obOut.flush();

           FileInputStream fIn = new FileInputStream("file.txt");
           ObjectInputStream obIn = new ObjectInputStream(fIn);

           Student ob4 = (Student) obIn.readObject();
           ob4.display();
       }
   }


   class Student implements Cloneable, Serializable {
       public void display() throws Exception {
           System.out.println("Display ");
       }@
       Override
       protected Object clone() throws CloneNotSupportedException {
           return super.clone();
       }
   }

有一些方法可以在Java中创建对象1)newInstance()方法2)new运算符3)clone()方法4)反序列化


0
投票

您可以在不调用new的情况下反序列化对象。

好的,你必须在newFileInputStream上调用ObjectInputStream,但我认为这是合理使用的。

 FileInputStream fis = new FileInputStream("myClassInstance.ser");
 ObjectInputStream ois = new ObjectInputStream(fis);
 MyClass myObject = (MyClass)ois.readObject();

0
投票

AFAIK,Class.newInstance()和Constructor.newInstance()不在内部使用new关键字。

在没有new关键字的情况下创建实例的其他方法:

  • Object.clone()
  • 序列化

0
投票

在不使用new运算符的情况下实例化类只有三种标准方法,它们如下所示:

  1. 的newInstance()
  2. 克隆()
  3. Deseria Zacion
© www.soinside.com 2019 - 2024. All rights reserved.