我正在做一个做自定义决策的应用程序。假设我有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 '类型将不会被推断为你的类类型,除非你先转换它。