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

Aru*_*run 9 java xml new-operator objectinstantiation

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

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

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

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

san*_*hat 10

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

Class<YourClass> c = YourClass.class;
YourClass instance = c.newInstance();
Run Code Online (Sandbox Code Playgroud)

另外,考虑enum到a special class,枚举的实例是在不使用newOperator 的情况下创建的.

public enum YourEnum { X, Y }
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 9

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

int ia[][] = { {1, 2}, null };
Run Code Online (Sandbox Code Playgroud)

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

Integer big = 9999;
Run Code Online (Sandbox Code Playgroud)

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

Class c = ThisClass.class;
String s = "a literal";
enum SomeEnum { WON, CHEW, TREE }
Run Code Online (Sandbox Code Playgroud)

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


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

有趣的是,Object.clone()ObjectInputStream.readObject()两个用于创建不涉及上述字节码,并且不叫构造以正常方式实例"神奇"的机制.


fGo*_*fGo 6

你可以使用jdbc的方式

Class.forName("YOURCLASSNAME").newInstance()
Run Code Online (Sandbox Code Playgroud)