Class BypassSyntheticClassLoader

java.lang.Object
com.ibm.wala.ipa.summaries.BypassSyntheticClassLoader
All Implemented Interfaces:
IClassLoader

public class BypassSyntheticClassLoader extends Object implements IClassLoader
This class represents class loaders that introduce classes that do not exist in the actual application being analyzed. They may be abstract summaries of unanalyzed library code, wrappers that encode J2EE specialized behavior or other invented classes.

The intention is that there be (at most) one such classloader in a given class hierarchy, and that it be referenced using the "Synthetic" classloader reference. Furthermore, it is required that this synthetic loader be a child loader of the Primordial, Extension and Application loaders.

This special classloader has some interactions with the hierarchy for, while the classes it loads are normal-seeming IClass objects, unlike the other loaders, its set of classes is not fixed, causing special cases in code that caches hierarchy data. Also note that this causes the getNumberfClasses and iterateAllClasses methods to behave differently for those of other classloaders.

Code that wants to introduce synthetic classes uses the registerClass method, giving it an Atom which is the class name, and an IClass which is the class to load. Since the synthetic loader must be a child of the others, it would be very bad to use an existing name for a new synthetic class.

Class lookup works just as for any other classloader.

Author:
Julian Dolby (dolby@us.ibm.com)
  • Constructor Details

    • BypassSyntheticClassLoader

      public BypassSyntheticClassLoader(ClassLoaderReference me, IClassLoader parent, SetOfClasses exclusions, IClassHierarchy cha)
      Don't change my signature! ClassLoaderFactoryImpl calls me by reflection! yuck.
      Parameters:
      me - the name of this class loader
      parent - its parent
      exclusions - classes to ignore
      cha - governing class hierarchy
  • Method Details

    • toString

      public String toString()
      Overrides:
      toString in class Object
    • lookupClass

      public IClass lookupClass(TypeName className)
      Description copied from interface: IClassLoader
      Find and return the IClass defined by this class loader that corresponds to the given class name.
      Specified by:
      lookupClass in interface IClassLoader
      Parameters:
      className - name of the class
      Returns:
      the IClass defined by this class loader that corresponds to the given class name, or null if not found.
    • registerClass

      public void registerClass(TypeName className, IClass theClass)
      Register the existence of a new synthetic class
    • getReference

      public ClassLoaderReference getReference()
      Return the ClassLoaderReference for this class loader.
      Specified by:
      getReference in interface IClassLoader
      Returns:
      ClassLoaderReference
    • iterateAllClasses

      public Iterator<IClass> iterateAllClasses()
      Specified by:
      iterateAllClasses in interface IClassLoader
      Returns:
      an Iterator of all classes loaded by this loader
    • getNumberOfClasses

      public int getNumberOfClasses()
      Specified by:
      getNumberOfClasses in interface IClassLoader
      Returns:
      the number of classes in scope to be loaded by this loader
    • getName

      public Atom getName()
      Specified by:
      getName in interface IClassLoader
      Returns:
      the unique name that identifies this class loader.
    • getLanguage

      public Language getLanguage()
      Specified by:
      getLanguage in interface IClassLoader
      Returns:
      the unique name that identifies the programming language from which this class loader loads code.
    • getNumberOfMethods

      public int getNumberOfMethods()
      Specified by:
      getNumberOfMethods in interface IClassLoader
    • getSourceFileName

      public String getSourceFileName(IClass klass)
      Specified by:
      getSourceFileName in interface IClassLoader
      Parameters:
      klass - the class for which information is desired.
      Returns:
      name of source file corresponding to the class, or null if not available
    • getParent

      public IClassLoader getParent()
      Specified by:
      getParent in interface IClassLoader
      Returns:
      the parent IClassLoader, if any, or null
    • init

      public void init(List<Module> modules) throws IOException
      Description copied from interface: IClassLoader
      Initialize internal data structures.
      Specified by:
      init in interface IClassLoader
      Throws:
      IOException
    • removeAll

      public void removeAll(Collection<IClass> toRemove)
      Description copied from interface: IClassLoader
      blow away references to any classes in the set
      Specified by:
      removeAll in interface IClassLoader
      Parameters:
      toRemove - Collection<IClass>
    • getSource

      public Reader getSource(IClass klass)
      Specified by:
      getSource in interface IClassLoader
      Returns:
      input stream representing the source file for a class, or null if not available
    • getInstructionFactory

      public SSAInstructionFactory getInstructionFactory()
      Specified by:
      getInstructionFactory in interface IClassLoader
    • getSource

      public Reader getSource(IMethod method, int offset)
      Specified by:
      getSource in interface IClassLoader
      Parameters:
      method - The method for which information is desired
      offset - an offset into the bytecode of the given method.
      Returns:
      input stream representing the source file for a given bytecode index of a given method, or null if not available
    • getSourceFileName

      public String getSourceFileName(IMethod method, int offset)
      Specified by:
      getSourceFileName in interface IClassLoader
      Parameters:
      method - The method for which information is desired
      offset - an offset into the bytecode of the given method.
      Returns:
      name of the source file corresponding to the given offset in the given method. Note that this api allows a single method to arise from multiple source files, which is deliberate as it can happen in some languages.