diff --git a/src/main/java/jef/asm/FilterMethodVisitor.java b/src/main/java/jef/asm/FilterMethodVisitor.java index a6140b5..bedb9f7 100644 --- a/src/main/java/jef/asm/FilterMethodVisitor.java +++ b/src/main/java/jef/asm/FilterMethodVisitor.java @@ -114,8 +114,10 @@ class FilterMethodVisitor extends MethodVisitor { var element = varStack.pop(); var collection = varStack.pop(); varStack.push(new BinaryExpression(element, collection, BinaryExpression.Operator.IN)); - } else if (name.startsWith("get") && name.length() > 3 && descriptor.startsWith("()")) { //hacky getter support, TODO replace this with proper getter eval later - var field = findField(owner, name); + } else if (descriptor.startsWith("()")) { + var method = Class.forName(owner.replace("/", ".")).getDeclaredMethod(name); + var res = new OptimizedAsmParser(method).parse(); + var field = res.getAccessedFields().stream().findFirst(); if (field.isPresent()) { var v = varStack.pop(); if (v instanceof ParameterExpression p) { diff --git a/src/main/java/jef/model/annotations/processors/KeyProcessorBase.java b/src/main/java/jef/model/annotations/processors/KeyProcessorBase.java index d1dcc43..baaff7c 100644 --- a/src/main/java/jef/model/annotations/processors/KeyProcessorBase.java +++ b/src/main/java/jef/model/annotations/processors/KeyProcessorBase.java @@ -1,7 +1,7 @@ package jef.model.annotations.processors; +import jef.asm.OptimizedAsmParser; import jef.model.DbEntityBuilder; -import jef.model.DbField; import jef.model.DbFieldBuilder; import jef.model.ModelBuilder; import jef.model.ModelException; @@ -13,7 +13,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Locale; abstract class KeyProcessorBase implements AnnotationProcessor { private final Class annotationClass; @@ -62,19 +61,20 @@ abstract class KeyProcessorBase implements AnnotationPr private Field getField(DbEntityBuilder entity, String fieldOrGetter) { Method getter = null; try { - getter = entity.type().get().getDeclaredMethod(fieldOrGetter); - } catch (NoSuchMethodException e) { + getter = entity.type().orElseThrow().getDeclaredMethod(fieldOrGetter); + } catch (NoSuchMethodException ignored) { } Field field = null; try { - if (getter != null && getter.getName().length() > 3 && getter.getName().startsWith("get")) { - var name = getter.getName().substring(3, 4).toLowerCase(Locale.ROOT) + getter.getName().substring(4); //TODO HACK - field = entity.type().get().getDeclaredField(name); + if (getter != null) { + var res = new OptimizedAsmParser(getter ).parse(); + var name = res.getAccessedFields().stream().findFirst().orElseThrow().getName(); + field = entity.type().orElseThrow().getDeclaredField(name); } else { - field = entity.type().get().getDeclaredField(fieldOrGetter); + field = entity.type().orElseThrow().getDeclaredField(fieldOrGetter); } - } catch (NoSuchFieldException e) { + } catch (NoSuchFieldException ignored) { } if (field == null) {