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

标签 java database reflection

我正在开发一个可以进行自定义决策的应用程序。假设我有 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/

相关文章:

android - 将混淆器用于 Android 应用程序时,反射方法不起作用

java - AOP(没有 Spring)不适用于 Tomcat 但 Eclipse

php - 如何对查询中的父项施加限制,但如果没有可用的父项,还取其中的单个产品?

database - 我应该保存 GeoIP 数据吗

php - 数据库驱动的 Web 应用程序的最佳解决方案?

java - 我如何在 Spring AOP 中访问实际的方法参数名称?

java - 获取原始类型的默认值

Java Netbeans 8.0 Jframe GUI 程序 - arraylist 中的每个索引值未显示在 jtextArea 中的单独行上

java - 如何使 .jar 可执行?

java - 我想了解子字符串调用在这段代码中是如何工作的?