欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java創(chuàng)建對象的常見方式技術指南

 更新時間:2025年06月24日 09:02:10   作者:拾荒的小海螺  
在?Java?開發(fā)中,對象是一切面向對象編程的基礎,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ù)需求改動示例

    這篇文章主要為大家介紹了mybatis-generator-gui根據(jù)需求改動示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111

    Caused by: java.io.IOException: DerInputStrea

    這篇文章主要介紹了Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • java實現(xiàn)錄音播放功能

    java實現(xiàn)錄音播放功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)錄音播放功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 簡單了解Spring Boot及idea整合jsp過程解析

    簡單了解Spring Boot及idea整合jsp過程解析

    這篇文章主要介紹了簡單了解Spring Boot及idea整合jsp過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Docker搭建前端Java的開發(fā)環(huán)境詳解

    Docker搭建前端Java的開發(fā)環(huán)境詳解

    相信每個人入職第一天就是搭建本地開發(fā)環(huán)境,因為我司用的是java,看見了多年不見的eclipse的圖標出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個人有此感受。這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,詳細的給大家介紹了利用Docker搭建前端Java的開發(fā)環(huán)境。
    2016-10-10
  • mybatis-generator自動生成dao、mapping、bean配置操作

    mybatis-generator自動生成dao、mapping、bean配置操作

    這篇文章主要介紹了mybatis-generator自動生成dao、mapping、bean配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • SpringBootTest--踩坑錯誤的解決

    SpringBootTest--踩坑錯誤的解決

    這篇文章主要介紹了SpringBootTest--踩坑錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java多線程同步的幾種常見方法

    Java多線程同步的幾種常見方法

    在 Java 中,多線程同步是確保多個線程在訪問共享資源時不會發(fā)生競爭和沖突的機制,Java 提供了多種方式來實現(xiàn)線程同步,以下是 Java 中常見的幾種同步方法,需要的朋友可以參考下
    2025-05-05
  • IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題

    IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題

    這篇文章主要介紹了IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下
    2019-05-05
  • Java volatile關鍵字原理剖析與實例講解

    Java volatile關鍵字原理剖析與實例講解

    volatile是Java提供的一種輕量級的同步機制,Java?語言包含兩種內在的同步機制:同步塊(或方法)和?volatile?變量,本文將詳細為大家總結Java volatile關鍵字,通過詳細的代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07

最新評論