10

在一次 Java 面试中,提出了以下问题:

在 java 中有没有一种方法可以在不使用new操作符的情况下实例化一个对象?我回复他说没有其他的实例化方式。但他问我如何用 java 文件中的配置实例化 java 中的对象xml(在 spring 框架中)。我说,在内部,spring 使用操作符reflection utils来创建一个对象new。但面试官并不相信我的回答。

我看到这个链接很有用,但是有一个new操作员间接参与了一个或其他内部方法。

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

4

8 回答 8

13

您可以使用Java 反射 API来完成。这就是 Spring 框架的 DI 的工作方式(从 xml 实例化对象)。

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

此外,考虑enum到是 a special class,枚举的实例是在不使用new运算符的情况下创建的。

public enum YourEnum { X, Y }
于 2013-05-17T10:55:40.067 回答
11

以下形式的数组初始值设定项不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()都使用“魔术”机制来创建不涉及上述字节码的实例,并且不以正常方式调用构造函数。

于 2013-05-17T11:01:29.680 回答
6

你可以使用jdbc的方式

Class.forName("YOURCLASSNAME").newInstance()
于 2013-05-17T13:28:05.283 回答
2

您可以使用clone方法来创建对象的副本,而无需使用 new 运算符。

克隆用于制作对象的副本。在使用 Object 的 clone 方法时,你应该记住一些事情。

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

字符串类的示例

String sample = new String();

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

String sampleClone = sample.clone();

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

公共静态类 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

于 2013-05-17T10:56:41.587 回答
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) 反序列化

于 2015-02-06T17:46:22.420 回答
0

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

好的,您必须调用newand FileInputStreamObjectInputStream但我认为这是合理使用。

 FileInputStream fis = new FileInputStream("myClassInstance.ser");
 ObjectInputStream ois = new ObjectInputStream(fis);
 MyClass myObject = (MyClass)ois.readObject();
于 2013-05-17T10:58:25.233 回答
0

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

不使用 new 关键字创建实例的其他方法:

  • Object.clone()
  • 序列化
于 2013-05-17T10:59:24.733 回答
0

在不使用 new 操作符的情况下实例化一个类的标准方法只有三种,它们如下:

  1. 新实例()
  2. 克隆()
  3. 反序列化
于 2015-12-16T06:03:55.467 回答