- // MethodAccessorGenerator
- private MagicAccessorImpl generate(final Class<?> var1, String var2, Class<?>[] var3, Class<?> var4, Class<?>[] var5, int var6, boolean var7, boolean var8, Class<?> var9) {
- ByteVector var10 = ByteVectorFactory.create();
- this.asm = new ClassFileAssembler(var10);
- this.declaringClass = var1;
- this.parameterTypes = var3;
- this.returnType = var4;
- this.modifiers = var6;
- this.isConstructor = var7;
- this.forSerialization = var8;
- this.asm.emitMagicAndVersion();
- short var11 = 42;
- boolean var12 = this.usesPrimitiveTypes();
- if (var12) {
- var11 = (short)(var11 + 72);
- }
- if (var8) {
- var11 = (short)(var11 + 2);
- }
- var11 += (short)(2 * this.numNonPrimitiveParameterTypes());
- this.asm.emitShort(add(var11, (short)1));
- final String var13 = generateName(var7, var8);
- this.asm.emitConstantPoolUTF8(var13);
- this.asm.emitConstantPoolClass(this.asm.cpi());
- this.thisClass = this.asm.cpi();
- if (var7) {
- if (var8) {
- this.asm.emitConstantPoolUTF8("sun/reflect/SerializationConstructorAccessorImpl");
- } else {
- this.asm.emitConstantPoolUTF8("sun/reflect/ConstructorAccessorImpl");
- }
- } else {
- this.asm.emitConstantPoolUTF8("sun/reflect/MethodAccessorImpl");
- }
- this.asm.emitConstantPoolClass(this.asm.cpi());
- this.superClass = this.asm.cpi();
- this.asm.emitConstantPoolUTF8(getClassName(var1, false));
- this.asm.emitConstantPoolClass(this.asm.cpi());
- this.targetClass = this.asm.cpi();
- short var14 = 0;
- if (var8) {
- this.asm.emitConstantPoolUTF8(getClassName(var9, false));
- this.asm.emitConstantPoolClass(this.asm.cpi());
- var14 = this.asm.cpi();
- }
- this.asm.emitConstantPoolUTF8(var2);
- this.asm.emitConstantPoolUTF8(this.buildInternalSignature());
- this.asm.emitConstantPoolNameAndType(sub(this.asm.cpi(), (short)1), this.asm.cpi());
- if (this.isInterface()) {
- this.asm.emitConstantPoolInterfaceMethodref(this.targetClass, this.asm.cpi());
- } else if (var8) {
- this.asm.emitConstantPoolMethodref(var14, this.asm.cpi());
- } else {
- this.asm.emitConstantPoolMethodref(this.targetClass, this.asm.cpi());
- }
- this.targetMethodRef = this.asm.cpi();
- if (var7) {
- this.asm.emitConstantPoolUTF8("newInstance");
- } else {
- this.asm.emitConstantPoolUTF8("invoke");
- }
- this.invokeIdx = this.asm.cpi();
- if (var7) {
- this.asm.emitConstantPoolUTF8("([Ljava/lang/Object;)Ljava/lang/Object;");
- } else {
- this.asm.emitConstantPoolUTF8("(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
- }
- this.invokeDescriptorIdx = this.asm.cpi();
- this.nonPrimitiveParametersBaseIdx = add(this.asm.cpi(), (short)2);
- for(int var15 = 0; var15 <var3.length; ++var15) {
- Class var16 = var3[var15];
- if (!isPrimitive(var16)) {
- this.asm.emitConstantPoolUTF8(getClassName(var16, false));
- this.asm.emitConstantPoolClass(this.asm.cpi());
- }
- }
- this.emitCommonConstantPoolEntries();
- if (var12) {
- this.emitBoxingContantPoolEntries();
- }
- if (this.asm.cpi() != var11) {
- throw new InternalError("Adjust this code (cpi =" + this.asm.cpi() + ", numCPEntries =" + var11 + ")");
- } else {
- this.asm.emitShort((short)1);
- this.asm.emitShort(this.thisClass);
- this.asm.emitShort(this.superClass);
- this.asm.emitShort((short)0);
- this.asm.emitShort((short)0);
- this.asm.emitShort((short)2);
- this.emitConstructor();
- this.emitInvoke();
- this.asm.emitShort((short)0);
- var10.trim();
- final byte[] var17 = var10.getData(); // class 数据
- return (MagicAccessorImpl)AccessController.doPrivileged(new PrivilegedAction<MagicAccessorImpl>() {
- public MagicAccessorImpl run() {
- try {
- // 生成反射类 GeneratedMethodAccessorN, 对应的 classLoader 为 DelegatingClassLoader
- return (MagicAccessorImpl)ClassDefiner.defineClass(var13, var17, 0, var17.length, var1.getClassLoader()).newInstance();
- } catch (IllegalAccessException | InstantiationException var2) {
- throw new InternalError(var2);
- }
- }
- });
- }
- }
来源: http://www.jianshu.com/p/4de2222030e8