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

时间:2015-06-04 16:34:51

标签: java database reflection

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

属性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?)

编辑:编辑的问题是为我的完整问题寻求帮助,而不仅仅是我的解决方案。

1 个答案:

答案 0 :(得分:0)

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,因为您正在寻求帮助,因为您认为解决方案可以解决当前的实际问题,而不是为您的最终目标寻求帮助