URLClassLoader: загрузка метода RestClient.builder () показывает исключение NoSuchMethodException - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь загрузить эластичный поиск RestClient динамически с помощью пользовательского загрузчика классов.Класс загружен успешно, так как я вижу все методы, объявленные в классе (очевидно, печатая их).Однако я не могу загрузить методы, которые передают org.apache.http. * классы в качестве параметров.

Например, когда я делаю это:

URLClassLoader classLoader = new URLClassLoader( new URL[] {
                    new URL("file:///home/user/Downloads/httpclient-4.5.8.jar"),
                    new URL("file:///home/user/Downloads/httpasyncclient-4.1.4.jar"),
                    new URL("file:///home/user/Downloads/httpcore-4.4.11.jar"),
                    new URL("file:///home/user/Downloads/rest-5.5.3.jar")},
                    this.getClass().getClassLoader() );

Class<?> restClient = Class.forName("org.elasticsearch.client.RestClient", true, classLoader);

            //Object restClassInstance = restClient.newInstance();
            Method m[] = restClient.getMethods();
            for(int i=0; i < m.length; i++) {
                String name = m[i].getName();
                Parameter[] params = m[i].getParameters();
                Class<?> types[] = m[i].getParameterTypes();
                System.out.println("Method Name : "+name);
                for(int j=0; j < types.length; j++) {
                    String param = types[j].getName();
                    System.out.println("params :: "+param);
                }
            }

Вывод, который я получаю:

Method Name : builder
params :: [Lorg.apache.http.HttpHost;

Когда я пытаюсь загрузить этот метод, вот так:

Class<?> httpHost = Class.forName("org.apache.http.HttpHost", true, classLoader);
Method restBuilderMethod = restClient.getMethod("builder",httpHost);

Я получаю это исключение:

java.lang.NoSuchMethodException: org.elasticsearch.client.RestClient.builder(org.apache.http.HttpHost)
    at java.lang.Class.getMethod(Class.java:1786)
    at com.example.demo.controller.TestController.customClassLoaderImpl(TestController.java:63)
    at com.example.demo.controller.TestController.main(TestController.java:27)

Из приведенных выше данных я вижу, что при проверке параметров, необходимых для метода построителя, он показывает: [Lorg.apache.http.HttpHost;

Но, за исключением,параметр отображается следующим образом: org.apache.http.HttpHost

Итак, я что-то здесь упускаю?Я ценю, если кто-то хотел бы направить меня в этом отношении.

...