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

Java 反射:如何比较未知类型的两个对象,java,database,reflection,Java,Database,Reflection,我正在做一个定制决策的应用程序。假设我有4个表:文档、文件、任务和流程。我正在使用JPA,所以每个表都被转换成一个实体,一个带有变量的Java类。 一个流程有许多任务,一个任务有一个关联的文件,一个文件有许多关联的文档。 我要做的是进行配置,以便可以将任务中的一个属性与流程中的另一个属性进行比较。 例如: 我在表决策中配置: 属性1:进程限制日期 属性2:任务实际日期 接线员:> 我想做的是在运行时知道这个变量的价值,以便做出一些决定 现在。 我有以下方法: public Object runG

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

属性1:进程限制日期 属性2:任务实际日期 接线员:>

我想做的是在运行时知道这个变量的价值,以便做出一些决定

现在。 我有以下方法:

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并捕获一个对象作为返回。这就是我想比较的对象。 但是我不知道那个对象是什么,所以我做了类似的事情来查找它的类型(我保存在表中):

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

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 ?

编辑:编辑该问题是为了我的全部问题而不是我想的解决方案寻求帮助。

Class.forName
返回一个
类。您需要将其强制转换为正确的类类型:

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);
Integer first=convertObject(新的整数(5),(Class)Class.forName(“java.lang.Integer”);
整数秒=convertObject(新的整数(10),(Class)Class.forName(“java.lang.Integer”);
System.out.println(第一次<第二次);
这将允许该方法推断泛型类型。由于
Class.forName
返回一个
Class
而不是Class
,因此方法中的
T`类型将不会推断为类类型,除非您先强制转换它


至于更好的解决办法,老实说,我不知道你想用这个来实现什么。请查看,因为您目前正在寻求帮助,以解决手头的实际问题,而不是为最终目标寻求帮助。forName
返回一个
类。您需要将其强制转换为正确的类类型:

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);
Integer first=convertObject(新的整数(5),(Class)Class.forName(“java.lang.Integer”);
整数秒=convertObject(新的整数(10),(Class)Class.forName(“java.lang.Integer”);
System.out.println(第一次<第二次);
这将允许该方法推断泛型类型。由于
Class.forName
返回一个
Class
而不是Class
,因此方法中的
T`类型将不会推断为类类型,除非您先强制转换它



至于更好的解决办法,老实说,我不知道你想用这个来实现什么。请注意,因为您目前正在寻求帮助,寻求您认为是解决手头实际问题的方法,而不是为您的最终目标寻求帮助

我编辑了主要问题,并添加了一些有关完整问题的信息,但我不想问这个问题,因为我觉得这类似于:请做我的家庭作业。我编辑了主要问题,并添加了一些关于完整问题的信息,但我不想问这个问题,因为我觉得应该是这样的:请做我的家庭作业。我编辑了主要问题,并添加了一些关于完整问题的信息,但我不想问这个问题,因为我觉得应该是这样的:请做我的家庭作业。但我们会感谢您的帮助。对象是否只是文档,只是不同类型的文档?文档就是一个例子。它可以比较5个不同的表格。比如说一个形式、一个流程、一个任务、一个文件或一个文档。那么你想比较一个任务和一个流程吗?你到底想在他们之间比较什么?创建一个抽象会容易得多,例如,
ProgramItem
(坏名字,只是一个例子),它包含要在每个项目(流程、任务等)之间进行比较的状态。或者您想根据要比较的内容执行特定的比较操作吗?不,不是任务和流程。我想比较一下ProcessLimitDate和TaskDate。两者都是日期属性。但在这个过程中,我为每项任务设定了限制日期。整数值或字符串值也是一样。
ProcessLimitDate
TaskDate
类吗?或者类型是
过程
任务
,您想比较它们的
日期
状态吗?如果包含更多的代码,并可能缩短您的问题(重新格式化以便其他人不需要阅读太多内容),那么对象是否只是文档,只是不同类型的文档?文档就是一个例子。它可以比较5个不同的表格。比如说一个形式、一个流程、一个任务、一个文件或一个文档。那么你想比较一个任务和一个流程吗?你到底想在他们之间比较什么?创建一个抽象会容易得多,例如,
ProgramItem
(坏名字,只是一个例子),它包含要在每个项目(流程、任务等)之间进行比较的状态。或者您想根据要比较的内容执行特定的比较操作吗?不,不是任务和流程。我想比较一下ProcessLimitDate和TaskDate。两者都是日期属性。但在这个过程中,我为每项任务设定了限制日期。整数值或字符串值也是一样。
ProcessLimitDate
TaskDate
类吗?或者类型是
过程
任务
,您想比较它们的
日期
状态吗?如果你包含更多的代码,并且可能缩短你的问题(重新格式化,这样其他人就不需要读那么多),那么就更容易理解了。对象是否只是文档,只是不同
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?)
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);