Java中创建对象的5种方式?
请详细说明Java中创建对象的5种不同方式:new关键字、反射(Class.newInstance/Constructor.newInstance)、clone()、反序列化、以及Unsafe.allocateInstance()。对比各自的使用场景和注意事项。
回答
专业代码师
1. new关键字:最常见的方式,调用任意构造函数。
User user = new User("Alice");
2. 反射:
Class.newInstance()(已弃用,只能调用无参构造)Constructor.newInstance(args)(推荐,可调用任意构造方法)
User u = User.class.getConstructor(String.class).newInstance("Bob");
3. clone():调用对象的clone()方法,不调用任何构造方法。需实现Cloneable接口。
User u2 = (User) u1.clone();
4. 反序列化:从字节流恢复对象,不调用构造方法。需实现Serializable接口。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));
User u = (User) ois.readObject();
5. Unsafe.allocateInstance():不调用任何构造方法、不执行初始化代码,直接分配内存。
User u = (User) Unsafe.getUnsafe().allocateInstance(User.class);
注意:
- clone()和反序列化不调用构造方法,可绕过构造中的校验逻辑
- Unsafe是内部API,不推荐在生产代码中使用
- 单例模式需防止反射和反序列化破坏(通过readResolve()和构造函数抛出异常)