@Override public AMethodMeta getDeclaredConstructor(IClass... parameterTypes) { AMethodMeta result = super.getDeclaredConstructor(parameterTypes); if(result == null) { parseRealClass(); result = super.getDeclaredConstructor(parameterTypes); } return result; }
@Override public Collection<AMethodMeta> getDeclaredConstructors() { parseRealClass(); return super.getDeclaredConstructors(); }
@Override public AMethodMeta getDeclaredMethod(String name, IClass... parameterTypes) { AMethodMeta result = super.getDeclaredMethod(name, parameterTypes); if(result == null) { parseRealClass(); result = super.getDeclaredMethod(name, parameterTypes); } return result; }
@Override public void initialized(ClassExecuteContext context){ if(buildMode == MODE_DELEGATE) { return; } MutableClass owner = (MutableClass) context.getOwner(); AMethodMeta meta = new AMethodMeta(context.getClassLoader(), name, owner, owner, arguments, argNames, returnType, exceptions, access); method = new AMethod(meta, context.getClassLoader(), methodBody, buildMode); if(method.getMeta().getName().equals(ASConstants.INIT)){ owner.addConstructor(meta); }else if(Modifiers.isBridge(method.getMeta().getModifiers())){ owner.getBridgeMethod().add(meta); }else{ owner.addDeclaredMethod(meta); } }
/** * * add * @param field */ public void addField(Field field) { getFields().add(field); }
@Override public Collection<AMethodMeta> getDeclaredMethods() { parseRealClass(); return super.getDeclaredMethods(); }
@Override public void initialized(ClassExecuteContext context) { MutableClass owner = (MutableClass) context.getOwner(); owner.addField(fe = new Field(owner, owner, type, modifiers, name)); }
for(AMethodMeta method : ((MutableClass)clazz).getBridgeMethod()) { if(!containMethod(nonAbstractMethods, method)){ nonAbstractMethods.add(method);
private void constructEachEnumConstant(){ constructEnumConsts(); if(getMethodDeclaringClass().getEnumNum() != enumArgumentsList.size()){ throw new ASMSupportException("exist unassigned enum constant!"); } KernelParam[] values = new KernelParam[getMethodDeclaringClass().getEnumNum()]; GlobalVariable enumConstant; int i = 0; for(EnumConstructorInfo enumArg : enumArgumentsList){ enumConstant = val(getMethodDeclaringClass()).field(enumArg.name); values[i] = enumConstant; String enumName = enumArg.name; KernelParam[] otherArgus = enumArg.argus; KernelParam[] enumArgus = new KernelParam[otherArgus.length + 2]; enumArgus[0] = val(enumName); enumArgus[1] = val(i); System.arraycopy(otherArgus, 0, enumArgus, 2, otherArgus.length); MethodInvoker mi = new_(getMethodDeclaringClass(), enumArgus); assign(enumConstant, mi); i++; } GlobalVariable gv = val(getMethodDeclaringClass()).field("ENUM$VALUES"); KernelArrayValue av = newarray(getArrayType(getMethodDeclaringClass(), 1), values); assign(gv, av); }