//getClass var
MethodSymbol javaLangClassSym = (MethodSymbol) rs.getSymbol(elementUtils.getName(clazz), cs, cut, n, false);
JCIdent javaLangClassId = tm.Ident(javaLangClassSym.getReturnType().tsym);
// Name classVarName = getClassVarName(className);
JCExpression forNameAccessor = tm.Select(javaLangClassId, javaLangClassSym.name);
JCExpression className = tm.Literal(typeId.toString());
JCMethodInvocation classGetter = tm.Apply(com.sun.tools.javac.util.List.<JCExpression>nil(), forNameAccessor, com.sun.tools.javac.util.List.<JCExpression>of(className));
// JCVariableDecl classDecl = tm.VarDef(tm.Modifiers(Flags.FINAL), classVarName, javaLangClassId, classGetter);
final List<String> exceptions = new LinkedList<String>();
exceptions.add("java.lang.ClassNotFoundException"); //for forName
JCExpression[] types = getTypes(params);
final com.sun.tools.javac.util.List<JCExpression> args;
final JCExpression javaReflectMethField;
final Name getterName;
if (symbol instanceof MethodSymbol) {
if (symbol.isConstructor()) {
getterName = elementUtils.getName("getDeclaredConstructor");
javaReflectMethField = getIdAfterImporting("java.lang.reflect.Constructor");
args = toList(types);
} else {
getterName = elementUtils.getName("getDeclaredMethod");
javaReflectMethField = getIdAfterImporting("java.lang.reflect.Method");
JCExpression mName = tm.Literal(symbol.name.toString());
args = merge(Collections.singleton(mName), toList(types));
}
exceptions.add("java.lang.NoSuchMethodException"); //thrown for both methods and constructors when calling getDeclared..
} else {
getterName = elementUtils.getName("getDeclaredField");
javaReflectMethField = getIdAfterImporting("java.lang.reflect.Field");
args = com.sun.tools.javac.util.List.<JCExpression>of(tm.Literal(symbol.name.toString()));
exceptions.add("java.lang.NoSuchFieldException");
}
Symbol fieldMethSym = rs.getSymbol(cut, n, null, accesseeVarName, null);
if (fieldMethSym == null) {
final JCExpression getMethField = tm.Select(classGetter, getterName);
final JCVariableDecl refDecl = tm.VarDef(tm.Modifiers(0l), accesseeVarName, javaReflectMethField, getNull());
final JCMethodInvocation mi = tm.Apply(com.sun.tools.javac.util.List.<JCExpression>nil(), getMethField, args);
final JCStatement refDeclInit = tm.Exec(tm.Assign(tm.Ident(refDecl.name), mi)); //separate initialization from declaration to make it easier to catch exceptions