在java中使用反射API
我有一个用于处理数学运算符的运算符接口,它有两种方法,如下所示:在java中使用反射API,java,Java,我有一个用于处理数学运算符的运算符接口,它有两种方法,如下所示: public interface Operator { double calculate(double firstNumber,double secondNumber); char getSign(); } 对于每个操作员,我都有一个实现操作员接口的类,如下所示: public class Plus implements Operator { public double calculate(double fir
public interface Operator
{
double calculate(double firstNumber,double secondNumber);
char getSign();
}
对于每个操作员,我都有一个实现操作员接口的类,如下所示:
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=newreflections(“mypackage”);
设置而不是使用反射API,您可以
- 在类路径中搜索目录和JAR
- 对于目录,请查找每个类文件
- 对于JAR,扫描每个类文件的文件
- 使用类似ASM的库读取类文件的字节码。
- 如果类实现了您的接口,请添加它
- 否则,请检查该类的所有超类和接口,以查看它们是否实现了该接口
您必须读取字节码的原因是您希望避免加载所有类只是为了查看继承层次结构,尤其是因为某些类可能无法加载或可能需要很长时间
不用说,使用一个为您实现这一点的库更容易。如果你想自己写这篇文章,我建议你阅读文章的来源,看看它是如何做到的
更简单的解决方案是使用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,也必须将实体名称指定为配置的一部分。使用类似的方法指定要扫描的类列表,并检查实例是否为。如果没有,反射API只能在这种情况下对您有所帮助。我认为核心Java API没有扫描类路径以查找子类型的功能。我的目的是自动选择正确的类来实现运算符。您有更好的主意吗?只需使用一些注册表(可能是一个简单的映射)要跟踪可用的数学运算符实现。枚举如何?是否考虑使用枚举?您可以定义扩展接口的enum,然后只需执行MyEnum.values()
稍后我使用Map处理运算符,但我应该更改程序并删除对Map的依赖关系。我的应用程序应该能够从.class文件(加、减等编译类)中自动从folder@marzie在这种情况下,您需要搜索要加载的类的包/文件夹。如果您只在该程序包中放置运算符,则会有所帮助。虽然代价高昂,但您应该只需要执行一次。@Peter Lawrey我将运算符放在同一个包中,但我不知道如何使用java反射调用适当的类API@marzie您可以调用Class.forName(className)。要确定要调用的名称,您需要在目录中查找该包。要查找,您需要搜索类路径。