All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mockit.internal.ImplementationClass Maven / Gradle / Ivy

/*
 * Copyright (c) 2006-2012 Rogério Liesenfeld
 * This file is subject to the terms of the MIT license (see LICENSE.txt).
 */
package mockit.internal;

import java.lang.reflect.Type;

import mockit.external.asm4.*;
import mockit.internal.util.*;

/**
 * Allows the creation of new implementation classes for interfaces and abstract classes.
 */
public class ImplementationClass
{
   private final Type mockedType;
   private byte[] generatedBytecode;

   public ImplementationClass() { mockedType = null; }
   protected ImplementationClass(Type mockedType) { this.mockedType = mockedType; }

   public final Class generateNewMockImplementationClassForInterface()
   {
      Class mockedClass = Utilities.getClassType(mockedType);
      ClassReader interfaceReader = ClassFile.createClassFileReader(mockedClass);
      String mockClassName = GeneratedClasses.getNameForGeneratedClass(mockedClass);
      ClassVisitor modifier = createMethodBodyGenerator(interfaceReader, mockClassName);
      interfaceReader.accept(modifier, ClassReader.SKIP_DEBUG);

      return defineNewClass(mockedClass.getClassLoader(), modifier, mockClassName);
   }

   protected ClassVisitor createMethodBodyGenerator(ClassReader typeReader, String className) { return null; }

   public final Class defineNewClass(ClassLoader parentLoader, ClassVisitor generator, String className)
   {
      generatedBytecode = generator.toByteArray();

      if (parentLoader == null) {
         //noinspection AssignmentToMethodParameter
         parentLoader = ImplementationClass.class.getClassLoader();
      }

      return new ClassLoader(parentLoader) {
         @Override
         protected Class findClass(String name)
         {
            //noinspection unchecked
            return (Class) defineClass(name, generatedBytecode, 0, generatedBytecode.length);
         }
      }.findClass(className);
   }

   public final byte[] getGeneratedBytecode() { return generatedBytecode; }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy