gpt4 book ai didi

java - 反射:如何比较未知类型的两个对象

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:50 25 4
gpt4 key购买 nike

我正在开发一个可以进行自定义决策的应用程序。假设我有 4 个表:文档、文件、任务和流程。我正在使用 JPA,因此每个表都被转换为一个实体,一个带有变量的 Java 类。一个进程有很多任务,一个任务有一个关联的文件,一个文件有很多关联的文档。我想要做的是配置,以便我可以将任务中的属性与进程中的另一个属性进行比较。例如:我在表中配置决策:

属性 1:处理限制日期属性 2:任务实际日期运算符:>

我想做的是在运行时了解该变量的值(value)以做出一些决定。

现在。我有这些方法:

public Object runGetter(Field field, Class o, Object instance) {
for (Method method : o.getMethods()) {
if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3))) {
if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase())) {
try {
System.out.println("Method Name: " + method.getName());
return method.invoke(instance);
} catch (IllegalAccessException | InvocationTargetException e) {
}
}
}
}
return null;
}

在类中搜索字段后,我将运行它的 getter 并捕获一个对象作为返回。这就是我想要比较的对象。但我不知道那个对象是什么,所以我做了类似的事情来查找它的类型(我将其保存在表中):

public <T> T convertirObjeto(Object objetoAConvertir, Class<T> claseDestino) {
try {
return claseDestino.cast(objetoAConvertir);
} catch(ClassCastException e) {
return null;
}

这将返回类似 String.class、Integer.class 的内容。

我的想法是我可以执行第一个方法,然后调用第二个方法发送第一个方法的返回对象并返回一个对象。假设我保存了一个整数。我想比较整数 1 是否高于或低于整数 2。我的理论(希望可能非常愚蠢)说我可以这样做:

 if (convertirObjeto(obtenerValorAtributo(atributo1),Class.forName(atributo1.getTipoAtributo())) <convertirObjeto(obtenerValorAtributo(atributo2),Class.forName(atributo2.getTipoAtributo()))) {

而不是仅仅转换

(Integer) obtenerValorAtributo(atributo2)

但是当我尝试比较时,编译器抛出以下错误:

Bad Operand types for binary operator '<'
First type: CAP#1
Second Type: CAP#2
Where CAP#1, CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ?

我认为,编译器试图告诉我:先生,你不知道这些对象是什么,请停止试图烧毁我。我的问题是:

If(Is there a *easier* solution for my problem than all that reflection I'm trying to do?)
Else If(Is there a way to fix that problem so I could compare two variables from different classes searching in database its name, table and maybe type?)

编辑:该问题已被编辑,请求帮助解决我的整个问题,而不仅仅是我的解决方案。

最佳答案

Class.forName返回 Class<?> 。您需要将其转换为正确的类类型:

Integer first = convertObject(new Integer(5), (Class<Integer>) Class.forName("java.lang.Integer"));
Integer second = convertObject(new Integer(10), (Class<Integer>) Class.forName("java.lang.Integer"));

System.out.println(first < second);

这将允许该方法推断泛型类型。自 Class.forName返回 Class<?>而不是类 , the方法中的 T` 类型不会被推断为您的类类型,除非您先对其进行强制转换。

至于更好的解决方案,说实话,我不知道你想用这个实现什么目的。查看the XY problem ,因为您目前正在寻求帮助来解决您认为是手头实际问题的解决方案,而不是为您的最终目标寻求帮助

关于java - 反射:如何比较未知类型的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649417/

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