反思:如何比较来自未知类型的两个对象



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

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

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 '类型将不会被推断为你的类类型,除非你先转换它。

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

相关内容

  • 没有找到相关文章

最新更新