View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.internal.expectations.mocking;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   import edu.umd.cs.findbugs.annotations.Nullable;
9   
10  import java.lang.reflect.Type;
11  
12  import mockit.asm.classes.ClassReader;
13  import mockit.asm.jvmConstants.Access;
14  import mockit.internal.classGeneration.BaseSubclassGenerator;
15  import mockit.internal.util.ObjectMethods;
16  
17  public final class SubclassGenerationModifier extends BaseSubclassGenerator {
18      public SubclassGenerationModifier(@NonNull Class<?> baseClass, @NonNull Type mockedType, @NonNull ClassReader cr,
19              @NonNull String subclassName, boolean copyConstructors) {
20          super(baseClass, cr, mockedType, subclassName, copyConstructors);
21      }
22  
23      @Override
24      protected void generateMethodImplementation(@NonNull String className, int access, @NonNull String name,
25              @NonNull String desc, @Nullable String signature, @Nullable String[] exceptions) {
26          if (signature != null && mockedTypeInfo != null) {
27              signature = mockedTypeInfo.genericTypeMap.resolveSignature(className, signature);
28          }
29  
30          mw = cw.visitMethod(Access.PUBLIC, name, desc, signature, exceptions);
31  
32          if (ObjectMethods.isMethodFromObject(name, desc)) {
33              generateEmptyImplementation(desc);
34          } else {
35              generateDirectCallToHandler(className, access, name, desc, signature);
36              generateReturnWithObjectAtTopOfTheStack(desc);
37              mw.visitMaxStack(1);
38          }
39      }
40  }