首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 反射機制實戰:基於配置文件的工廠模式實現

     編輯:Java 相關知識

場景介紹

本例演示如何結合 Java 反射、Properties 配置文件與工廠模式,實現根據配置動態創建對象,實現「修改配置、不改代碼」的解耦效果。

核心代碼結構

1. 介面與實現類

interface Fruit {
    void eat();
}

class Apple implements Fruit {
    public void eat() { System.out.println("eat Apple"); }
}

class Orange implements Fruit {
    public void eat() { System.out.println("eat Orange"); }
}

2. 配置文件管理

class ConfigManager {
    public static Properties loadConfig() throws IOException {
        Properties props = new Properties();
        File file = new File("fruit.properties");
        if (file.exists()) {
            props.load(new FileInputStream(file));
        } else {
            // 默認配置
            props.setProperty("apple", "reflect.Apple");
            props.setProperty("orange", "reflect.Orange");
            props.store(new FileOutputStream(file), "FRUIT CLASS");
        }
        return props;
    }
}

3. 反射工廠

class FruitFactory {
    public static Fruit getInstance(String className) {
        try {
            return (Fruit) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

4. 客戶端調用

public class Main {
    public static void main(String[] args) {
        try {
            Properties props = ConfigManager.loadConfig();
            Fruit fruit = FruitFactory.getInstance(props.getProperty("apple"));
            if (fruit != null) fruit.eat();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果

有配置文件!
eat Apple

關鍵點解析

  • Class.forName():根據全限定類名加載類對象,是反射的入口。
  • newInstance():調用無參構造器創建實例(Java 9+ 建議用 clazz.getDeclaredConstructor().newInstance())。
  • 異常處理:反射操作拋出受檢異常,需捕獲 ClassNotFoundException、InstantiationException、IllegalAccessException 等。
  • 配置外部化:類名存放在 properties 文件,便於部署後擴展新實現類無需重新編譯打包。

擴展建議

  • 引入緩存機制,避免重複反射創建對象開銷。
  • 支持構造器參數注入,結合 setter 注入實現更完整的 DI 容器雛形。
  • 使用 ServiceLoader 機制替代手工配置,符合 Java SPI 規範。

總結

反射賦予 Java 動態性,配合工廠模式與外部配置,是構建可擴展框架的基石。本例雖簡單,但包含了反射實戰的核心要素。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved