我正在做一个做自定义决策的应用程序。假设我有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?)
编辑:编辑的问题是为我的完整问题寻求帮助,而不仅仅是我的解决方案。
答案 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,因为您正在寻求帮助,因为您认为解决方案可以解决当前的实际问题,而不是为您的最终目标寻求帮助