org.python.core

## Class BytecodeLoader

- java.lang.Object
- - org.python.core.BytecodeLoader

    public class BytecodeLoader
    extends java.lang.Object

Utility class for loading compiled Python modules and Java classes defined in Python modules.

### Nested Class Summary

Nested Classes
`static class` `BytecodeLoader.Loader`

### Constructor Summary

Constructors
Constructor and Description
`BytecodeLoader()`

### Method Summary

All Methods Static Methods Concrete Methods
`static void` `fixPyBytecode(java.lang.Class<? extends ContainsPyBytecode> c)` This method looks for Python-Bytecode stored in String literals.
`static java.lang.Class<?>` `makeClass(java.lang.String name, byte[] data, java.lang.Class<?>... referents)` Turn the Java class file data into a Java class.
`static java.lang.Class<?>` `makeClass(java.lang.String name, java.util.List<java.lang.Class<?>> referents, byte[] data)` Turn the Java class file data into a Java class.
`static PyCode` `makeCode(java.lang.String name, byte[] data, java.lang.String filename)` Turn the Java class file data for a compiled Python module into a `PyCode` object, by constructing an instance of the named class and calling the instance's `PyRunnable.getMain()`.

### Methods inherited from class java.lang.Object

`equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### BytecodeLoader

    public BytecodeLoader()

### Method Detail

#### makeClass

    public static java.lang.Class<?> makeClass(java.lang.String name,
                                               byte[] data,
                                               java.lang.Class<?>... referents)

Turn the Java class file data into a Java class.

Parameters:
  `name` - fully-qualified binary name of the class
  `data` - a class file as a byte array
  `referents` - super-classes and interfaces that the new class will reference.

#### makeClass

    public static java.lang.Class<?> makeClass(java.lang.String name,
                                               java.util.List<java.lang.Class<?>> referents,
                                               byte[] data)

Turn the Java class file data into a Java class.

Parameters:
  `name` - the name of the class
  `referents` - super-classes and interfaces that the new class will reference.
  `data` - a class file as a byte array

#### fixPyBytecode

    public static void fixPyBytecode(java.lang.Class<? extends ContainsPyBytecode> c)
                              throws java.lang.IllegalAccessException,
                                     java.lang.NoSuchFieldException,
                                     java.io.IOException,
                                     java.lang.ClassNotFoundException

This method looks for Python-Bytecode stored in String literals. While Java supports rather long strings, constrained only by int-addressing of arrays, it supports only up to 65535 characters in literals (not sure how escape-sequences are counted). To circumvent this limitation, the code is automatically splitted into several literals with the following naming-scheme. - The marker-interface 'ContainsPyBytecode' indicates that a class contains (static final) literals of the following scheme: - a prefix of '___' indicates a bytecode-containing string literal - a number indicating the number of parts follows - '0_' indicates that no splitting occurred - otherwise another number follows, naming the index of the literal - indexing starts at 0 Examples: ___0_method1 contains bytecode for method1 ___2_0_method2 contains first part of method2's bytecode ___2_1_method2 contains second part of method2's bytecode Note that this approach is provisional. In future, Jython might contain the bytecode directly as bytecode-objects. The current approach was feasible with much less complicated JVM bytecode-manipulation, but needs special treatment after class-loading.

Throws:
  `java.lang.IllegalAccessException`
  `java.lang.NoSuchFieldException`
  `java.io.IOException`
  `java.lang.ClassNotFoundException`

#### makeCode

    public static PyCode makeCode(java.lang.String name,
                                  byte[] data,
                                  java.lang.String filename)

Turn the Java class file data for a compiled Python module into a `PyCode` object, by constructing an instance of the named class and calling the instance's `PyRunnable.getMain()`.

Parameters:
  `name` - fully-qualified binary name of the class
  `data` - a class file as a byte array
  `filename` - to provide to the constructor of the named class
Returns:
  the `PyCode` object produced by the named class' `getMain`