Looking for java Keywords? Try Ask4Keywords

Java Language Загрузка внешнего файла .class


пример

Чтобы загрузить класс, мы сначала должны его определить. Класс определяется ClassLoader . Есть только одна проблема, Oracle не написала код ClassLoader с этой доступной функцией. Чтобы определить класс, нам нужно получить доступ к методу с именем defineClass() который является приватным методом класса ClassLoader .

Чтобы получить доступ к нему, мы создадим новый класс ByteClassLoader и распространим его на ClassLoader . Теперь, когда мы расширили наш класс до ClassLoader , мы можем получить доступ к приватным методам ClassLoader . Чтобы сделать defineClass() доступным, мы создадим новый метод, который будет действовать как зеркало для частного defineClass() . Для вызова частного метода нам потребуется имя класса, name , класс байт, classBytes , смещенные первый байт, который будет 0 , поскольку classBytes данные 'начинается в classBytes[0] , и смещение последнего байта, который будет classBytes.lenght потому что он представляет собой размер данных, который будет последним смещением.

public class ByteClassLoader extends ClassLoader {

    public Class<?> defineClass(String name, byte[] classBytes) {
        return defineClass(name, classBytes, 0, classBytes.length);
    }

}

Теперь у нас есть общедоступный defineClass() . Его можно вызвать, передав имя класса и байты класса в качестве аргументов.

Допустим, у нас есть класс с именем MyClass в пакете stackoverflow ...

Для вызова метода нам нужны байты класса, поэтому мы создаем объект Path представляющий Path нашего класса, используя метод Paths.get() и передавая путь двоичного класса в качестве аргумента. Теперь мы можем получить байты класса с Files.readAllBytes(path) . Поэтому мы создаем экземпляр ByteClassLoader и используем метод, который мы создали, defineClass() . У нас уже есть байты класса, но для вызова нашего метода нам также нужно имя класса, которое дается именем пакета (точка) канонического имени класса, в данном случае stackoverflow.MyClass .

Path path = Paths.get("MyClass.class");

ByteClassLoader loader = new ByteClassLoader();
loader.defineClass("stackoverflow.MyClass", Files.readAllBytes(path);

Примечание . Метод defineClass() возвращает объект Class<?> . Вы можете сохранить его, если хотите.

Чтобы загрузить класс, мы просто вызываем loadClass() и передаем имя класса. Этот метод может генерировать ClassNotFoundException поэтому нам нужно использовать блок cath try

try{
    loader.loadClass("stackoverflow.MyClass");
} catch(ClassNotFoundException e){
    e.printStackTrace();
}