Java創(chuàng)建對象的常見方式技術指南
1、簡述
在 Java 開發(fā)中,“對象”是一切面向對象編程的基礎。Java 提供了多種方式來創(chuàng)建對象,不同方式背后有不同的應用場景與運行機制。理解這些方法,對于提升系統(tǒng)性能、掌握底層機制都有重要價值。
2、創(chuàng)建對象
2.1 使用 new 關鍵字(最常見)
示例代碼:
public class User { String name; } ???????User user = new User();
說明:
- 最常見、最直觀的方式。
- 會調用構造方法,分配內存并初始化對象。
- 編譯期類型安全,適用于絕大多數(shù)場景。
2.2 使用反射 Class.newInstance()(不推薦)
示例代碼:
Class<?> clazz = Class.forName("com.example.User"); User user = (User) clazz.newInstance();
注意事項:
- 要求類必須有無參構造方法。
- 在 Java 9 后被標記為過時(deprecated),建議使用 getDeclaredConstructor().newInstance() 替代。
- 會拋出 InstantiationException、IllegalAccessException。
2.3 使用反射 Constructor.newInstance()(推薦反射方式)
示例代碼:
Constructor<User> constructor = User.class.getDeclaredConstructor(); constructor.setAccessible(true); User user = constructor.newInstance();
特點:
- 支持調用私有構造方法。
- 更靈活、安全(可以指定構造函數(shù)參數(shù))。
- 常用于依賴注入、框架內部如 Spring、MyBatis。
2.4 使用 clone() 方法(淺拷貝)
示例代碼:
public class User implements Cloneable { String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } // 使用 User user1 = new User(); user1.name = "Tom"; User user2 = (User) user1.clone();
特點:
- 克隆一個已存在的對象,屬于對象復制而非創(chuàng)建全新結構。
- 默認是淺拷貝,若包含引用類型字段需手動實現(xiàn)深拷貝。
- 需要實現(xiàn) Cloneable 接口,否則拋出 CloneNotSupportedException。
2.5 使用反序列化(從字節(jié)流創(chuàng)建)
示例代碼:
// 序列化 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser")); out.writeObject(user); // 反序列化 ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser")); User user2 = (User) in.readObject();
特點:
- 常用于網(wǎng)絡傳輸、緩存存儲等場景。
- 類必須實現(xiàn) Serializable 接口。
- 會跳過構造方法的調用(繞過 init 階段)。
2.6 使用對象工廠(工廠模式)
示例代碼:
public class UserFactory { public static User createUser(String name) { User user = new User(); user.name = name; return user; } }
特點:
- 封裝對象創(chuàng)建邏輯,便于集中管理。
- 工廠模式是實際開發(fā)中常用設計模式之一。
- Spring 中的 BeanFactory / ApplicationContext 就是這種思想。
2.7 使用第三方庫:如 CGLIB、Objenesis
CGLIB 動態(tài)代理創(chuàng)建對象(無構造函數(shù)調用)
Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(User.class); enhancer.setCallback(new NoOp() {}); User proxyUser = (User) enhancer.create();
Objenesis
Objenesis objenesis = new ObjenesisStd(); User user = objenesis.newInstance(User.class);
特點:
- 用于創(chuàng)建不調用構造函數(shù)的對象(繞過 new、反射等限制)。
- Spring、Mockito、Hibernate 等底層使用場景廣泛。
- 不適合日常業(yè)務開發(fā),更多用于框架底層實現(xiàn)。
2.8 總結對比
方式 | 是否調用構造函數(shù) | 是否常用 | 應用場景 |
---|---|---|---|
new | ? 是 | ? 常用 | 普通對象創(chuàng)建 |
Class.newInstance() | ? 是 | ? 已過時 | 框架反射,舊代碼中偶見 |
Constructor.newInstance() | ? 是 | ? 推薦 | Spring、框架依賴注入 |
clone() | ? 否(復制) | ?? 慎用 | 對象拷貝、實現(xiàn)原型模式 |
反序列化 | ? 否 | ?? 慎用 | 網(wǎng)絡傳輸、緩存恢復 |
工廠方法 | ? 是 | ? 常用 | 面向接口編程、統(tǒng)一對象創(chuàng)建入口 |
Objenesis / CGLIB | ? 否 | ? 框架級 | Spring、Mock 框架底層、ORM 動態(tài)代理 |
實踐建議
日常開發(fā):首選 new 或工廠方法,代碼清晰,易維護。
框架開發(fā):選擇反射 Constructor.newInstance() 或 Objenesis。
對象復制:優(yōu)先考慮手動復制或使用庫如 Apache Commons Lang 的 SerializationUtils,避免使用 clone()。
性能敏感:避免使用反序列化方式,風險高、開銷大。
3、結語
Java 提供了多種方式創(chuàng)建對象,不同方式各有適用場景。掌握它們不僅有助于寫出更靈活的代碼,也有助于深入理解如 Spring、MyBatis、Dubbo 等優(yōu)秀框架的實現(xiàn)原理。推薦大家多動手實踐,如自己實現(xiàn)一個對象工廠,或基于反射構建簡單容器,進一步鞏固理解。
如果你想,我可以繼續(xù)提供以下內容:
- 示例源碼項目結構(含反射、clone、Objenesis等示例)
- 對比幾種方式的創(chuàng)建性能(Benchmark)
- 與 Spring Bean 創(chuàng)建過程的對應關系
到此這篇關于Java創(chuàng)建對象的常見方式技術指南的文章就介紹到這了,更多相關Java創(chuàng)建對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis-generator-gui根據(jù)需求改動示例
這篇文章主要為大家介紹了mybatis-generator-gui根據(jù)需求改動示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Caused by: java.io.IOException: DerInputStrea
這篇文章主要介紹了Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10Docker搭建前端Java的開發(fā)環(huán)境詳解
相信每個人入職第一天就是搭建本地開發(fā)環(huán)境,因為我司用的是java,看見了多年不見的eclipse的圖標出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個人有此感受。這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,詳細的給大家介紹了利用Docker搭建前端Java的開發(fā)環(huán)境。2016-10-10mybatis-generator自動生成dao、mapping、bean配置操作
這篇文章主要介紹了mybatis-generator自動生成dao、mapping、bean配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題
這篇文章主要介紹了IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下2019-05-05