Как я могу загрузить классы в работающую программу Java - PullRequest
0 голосов
/ 23 декабря 2018

Это код моего Agent.jar

public class Agent
{

    public static void agentmain(String s, Instrumentation instrumentation)
    {
        try
        {
            ClassLoader classLoader = null;
            for (Class clazz : instrumentation.getAllLoadedClasses())
            {
                String className = clazz.getName();
                if (className.equalsIgnoreCase("ave")) /* Just a class from the running Programm */
                {
                    classLoader = clazz.getClassLoader();
                }
            }

            /* In the Cheat.jar are Classes which im trying to load */
            ClassLoader loader = URLClassLoader.newInstance(new URL[]{new URL("C:\\Users\\michi\\Desktop\\Injection\\Cheat.jar")}, classLoader);
            Class.forName("de.simplyblack.client.client.module.Category", true, loader);
            Class.forName("de.simplyblack.client.client.module.Module", true, loader);
            Class.forName("de.simplyblack.client.client.module.ModuleManager", true, loader);
        } catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}

Я загружаю его с помощью дополнительной программы.

 VirtualMachine virtualMachine = VirtualMachine.attach(id);
 virtualMachine.loadAgent(new File("C:\\Users\\michi\\Desktop\\Injection\\Client.jar").getAbsolutePath());
 virtualMachine.detach();

Но это не работает.

Later I visit an Class, and make an call for the ModuleManager class.

Если я ввожу его, я получаю

Class not found: de.simplyblack.client.client.module.ModuleManager

ошибку.

Не могли бы вы сказать мне, как я могу это исправить?Это мне очень поможет!Спасибо.

1 Ответ

0 голосов
/ 07 января 2019

Когда ссылки внутри класса разрешены, используется его определяющий загрузчик классов.Ваш код идентифицирует определяющий загрузчик классов для класса, который вы хотите использовать, но затем создает новый загрузчик классов, используя его в качестве родительского загрузчика.

Когда вы запрашиваете этот новый загрузчик для загрузки ваших классов, классы очень вероятно загружены , но они доступны только через только что созданный вами URLClassLoader.Они недоступны для других загрузчиков классов.

Инструментарий классов с кодом, содержащим новые зависимости от других классов, может быть очень сложным.Если инструментированные классы были загружены загрузчиком классов приложения, вы можете использовать Instrumentation.appendToSystemClassLoaderSearch(JarFile), чтобы добавить свой Cheat.jar в путь поиска, чтобы сделать классы доступными.

Для классовзагружается другими загрузчиками, все становится сложнее.Если они следуют стандартной модели родительского делегирования, вы можете использовать appendToBootstrapClassLoaderSearch(JarFile), чтобы сделать ваши классы доступными для всех этих загрузчиков классов.

Для загрузчика, который не следует модели делегирования, вы должны иметькопать глубже, например, использовать Reflection с переопределением доступа, вызвать defineClass, чтобы сделать классы доступными в этой области.

...