在一次Java访谈中,提出以下问题:
在java中有没有一种方法可以在不使用new
运算符的情况下实例化对象?我回答他说没有其他的实例化方法。但是他问我如何使用java中xml
文件中的配置(在spring框架中)实例化java中的对象。我说,内部弹簧使用reflection utils
来创建一个带有new
运算符的对象。但面试官并不相信我的回答。
我看到this link有用,但有一个new
运算符间接涉及一个或另一个内部方法。
有没有办法在不使用new
运算符的情况下在java中实例化对象?
答案 0 :(得分:10)
您可以使用Java Reflection API执行此操作。这就是Spring框架的DI工作原理(从xml实例化对象)。
Class<YourClass> c = YourClass.class;
YourClass instance = c.newInstance();
另外,
考虑enum
是special 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方法时,您应该记住某些事项。
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的情况下反序列化对象。
好的,你必须在new
和FileInputStream
上致电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关键字创建实例的其他方法:
答案 7 :(得分:0)
在不使用new运算符的情况下实例化类只有三种标准方法,它们如下:
- 的newInstance()
- 克隆()
- 反序列化
醇>