gpt4 book ai didi

java - 在 Java 中使用反射 API

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:07 24 4
gpt4 key购买 nike

我有一个用于处理数学运算符的运算符接口(interface),它有两个方法:

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

对于每个运算符,我都有一个实现运算符接口(interface)的类,如下所示:

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

等等...在此代码中,我使用反射:

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

Reflections 不是 java Reflection API 的一部分。我应该只使用 java Reflection 功能。谁能帮我更改此仅使用 java Reflection API 的代码?

最佳答案

除了使用 Reflections API,您还可以

  • 在类路径中搜索目录和 JAR
    • 在目录中查找每个类文件
    • 对于 JAR 扫描每个类文件的文件
  • 用像ASM 这样的库读取类文件的字节码。
    • 如果该类实现了您的接口(interface),则添加它
    • 否则检查该类的所有父类(super class)和接口(interface),看它们是否实现了该接口(interface)。

您必须阅读字节码的原因是您希望避免加载所有类只是为了查看继承层次结构,尤其是因为某些类可能无法加载或可能需要很长时间。

不用说,使用为您执行此操作的库会更容易。如果您想自己编写此代码,我建议您阅读 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();

关于java - 在 Java 中使用反射 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com