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

时间:2013-05-17 10:52:56

标签: java xml new-operator objectinstantiation

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

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

我看到this link有用,但有一个new运算符间接涉及一个或另一个内部方法。

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

8 个答案:

答案 0 :(得分:10)

您可以使用Java Reflection API执行此操作。这就是Spring框架的DI工作原理(从xml实例化对象)。

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

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

public enum YourEnum { X, Y }

答案 1 :(得分: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()都使用“魔术”机制来创建不涉及上述字节码的实例,并且不以正常方式调用构造函数。

答案 2 :(得分:6)

你可以使用jdbc的方式

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

答案 3 :(得分:2)

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

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

答案 4 :(得分: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)新的运营商 3)clone()方法 4)反序列化

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

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

  • Object.clone()
  • 序列化

答案 7 :(得分:0)

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

  
      
  1. 的newInstance()
  2.   
  3. 克隆()
  4.   
  5. 反序列化
  6.