1 21 package com.db4o.nativequery.optimization; 22 23 import java.lang.reflect.*; 24 25 import com.db4o.nativequery.expr.cmp.*; 26 import com.db4o.nativequery.expr.cmp.field.*; 27 28 class TypeDeducingVisitor implements ComparisonOperandVisitor { 29 private Class _predicateClass; 30 private Class _candidateClass; 31 private Class _clazz; 32 33 public TypeDeducingVisitor(Class predicateClass, Class candidateClass) { 34 this._predicateClass = predicateClass; 35 this._candidateClass = candidateClass; 36 _clazz=null; 37 } 38 39 public void visit(PredicateFieldRoot root) { 40 _clazz=_predicateClass; 41 } 42 43 public void visit(CandidateFieldRoot root) { 44 _clazz=_candidateClass; 45 } 46 47 public void visit(StaticFieldRoot root) { 48 try { 49 _clazz=Class.forName(root.className()); 50 } catch (ClassNotFoundException e) { 51 e.printStackTrace(); 52 } 53 } 54 55 public Class operandClass() { 56 return _clazz; 57 } 58 59 public void visit(ArithmeticExpression operand) { 60 } 61 62 public void visit(ConstValue operand) { 63 _clazz=operand.value().getClass(); 64 } 65 66 public void visit(FieldValue operand) { 67 operand.parent().accept(this); 68 try { 69 _clazz=fieldFor(_clazz,operand.fieldName()).getType(); 70 } catch (Exception e) { 71 e.printStackTrace(); 72 } 73 } 74 75 public void visit(ArrayAccessValue operand) { 76 operand.parent().accept(this); 77 _clazz=_clazz.getComponentType(); 78 } 79 80 Field fieldFor(Class clazz,String fieldName) { 81 while(clazz!=null) { 82 try { 83 return clazz.getDeclaredField(fieldName); 84 } catch (Exception e) { 85 } 86 } 87 return null; 88 } 89 90 public void visit(MethodCallValue operand) { 91 operand.parent().accept(this); 92 Method method=ReflectUtil.methodFor(_clazz, operand.methodName(), operand.paramTypes()); 93 _clazz=method.getReturnType(); 94 } 95 } | Popular Tags |