在一次java访谈中,提出以下问题:
在java中有没有一种方法来实例化一个对象而不使用new
运算符?我回答他说没有其他的实例化方法。但是他问我如何使用java中的xml
文件(在spring框架中)中的配置来实例化java中的对象。我说,内部弹簧使用reflection utils
创建一个new
运算符的对象。但面试官并不相信我的回答。
我看到this link很有用但是有一个new
操作员间接参与了一个或另一个内部方法。
有没有办法在不使用new
运算符的情况下在java中实例化对象?
你可以使用Java Reflection API来做到这一点。这就是Spring框架的DI工作原理(从xml实例化对象)。
Class<YourClass> c = YourClass.class;
YourClass instance = c.newInstance();
另外,考虑到enum
是special class
,枚举的实例是在不使用new
算子的情况下创建的。
public enum YourEnum { X, Y }
以下形式的数组初始值设定项不明确使用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()
都使用“魔术”机制来创建不涉及上述字节码的实例,并且不以正常方式调用构造函数。
你可以使用jdbc的方式
Class.forName("YOURCLASSNAME").newInstance()
您可以使用clone
方法创建没有new运算符的对象副本。
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
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)反序列化
您可以在不调用new的情况下反序列化对象。
好的,你必须在new
和FileInputStream
上调用ObjectInputStream
,但我认为这是合理使用的。
FileInputStream fis = new FileInputStream("myClassInstance.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
MyClass myObject = (MyClass)ois.readObject();
AFAIK,Class.newInstance()和Constructor.newInstance()不在内部使用new
关键字。
在没有new关键字的情况下创建实例的其他方法:
在不使用new运算符的情况下实例化类只有三种标准方法,它们如下所示:
- 的newInstance()
- 克隆()
- Deseria Zacion