public AMethodMeta(ClassHolder classHolder, String name, IClass owner, IClass actuallyOwner,
    		IClass[] argClasses, String[] argNames, IClass returnClass,
    		IClass[] exceptions, int modifier) {
        if(ArrayUtils.isNotEmpty(argClasses) && ArrayUtils.isEmpty(argNames)) {
            argNames = new String[argClasses.length];
            for(int i=0; i<argNames.length; i++) {
                argNames[i] = "arg" + i;
            }
        }
        
        if (argClasses == null) {
            argClasses = new IClass[0];
        }
        if (argNames == null) {
            argNames = new String[0];
        }
        if (exceptions == null) {
            exceptions = new IClass[0];
        }
        this.exceptions = exceptions;
        this.name = name;
        this.owner = owner;
        this.actuallyOwner = actuallyOwner;
        this.argNames = argNames;
        this.modifier = modifier;
        this.argClasses = argClasses;

        if (argClasses.length != argNames.length) {
            throw new ASMSupportException(
                    "Different length between argClasses and argNames when create method : " + name);
        }

        this.argTypes = new Type[argClasses.length];
        for (int i = 0; i < argClasses.length; i++) {
            this.argTypes[i] = argClasses[i].getType();
        }

        if (returnClass == null) {
            this.returnType = Type.VOID_TYPE;
            this.returnClass = classHolder.getType(void.class);
        } else {
            this.returnType = returnClass.getType();
            this.returnClass = returnClass;
        }
    }