簡體   English   中英

在java中使用Reflection API

[英]Using Reflection API in java

我有一個用於處理數學運算符的Operator接口,它有兩個方法,如下所示:

public interface Operator
{
  double calculate(double firstNumber,double secondNumber);
  char getSign();
}

對於每個運算符,我有一個實現Operator接口的類,如下所示:

public class Plus implements Operator
{   
  public double calculate(double firstNumber,double secondNumber)
  {
     return firstNumber + secondNumber;
  }
  public char getSign()
  {
     return '+';
  }
}

等等......在這段代碼中我使用了Reflections:

Reflections reflections = new Reflections("mypackage");
Set<Class<? extends Operator>> classes = reflections.getSubTypesOf(Operator.class);

反射不是java Reflection API的一部分。我應該只使用java Reflection功能。 任何人都可以幫我改變只使用java Reflection API的代碼嗎?

您可以使用Reflections API,而不是使用Reflections API

  • 在類路徑中搜索目錄和JAR
    • 為目錄查找每個類文件
    • 用於JAR掃描每個類文件的文件
  • 使用像ASM這樣的庫讀取類文件的字節代碼。
    • 如果類實現你的接口添加它
    • 否則檢查類的所有超類和接口,看看它們是否實現了接口。

您必須閱讀字節代碼的原因是您希望避免加載所有類只是為了查看繼承層次結構,特別是因為某些類可能無法加載或可能需要很長時間。

毋庸置疑,使用為您執行此操作的庫更容易。 如果你自己寫這篇文章,我建議你閱讀Reflections API的來源,看看它是如何做到的。


一個更簡單的解決方案是使用enum

enum Operators implement Operator {
    PLUS {
        public double calculate(double x, double y) {
           return x + y;
        }
        public char getSign() {
           return '+';
        }
    },
    MINUS {
        public double calculate(double x, double y) {
           return x - y;
        }
        public char getSign() {
           return '-';
        }
    },
    TIMES {
        public double calculate(double x, double y) {
           return x * y;
        }
        public char getSign() {
           return '*';
        }
    },
    DIVIDE {
        public double calculate(double x, double y) {
           return x / y;
        }
        public char getSign() {
           return '/';
        }
    }
}

獲得您可以使用的所有操作員

Operator[] operators = Operators.values();

您無法掃描子類型的類路徑。 如果您可以關聯,即使對於JPA,您也必須將實體名稱指定為配置的一部分。 使用類似的方法指定要掃描的類列表,並檢查instanceof 如果沒有,Reflections API只能幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM