Отражение Java: вызов абстрактных методов интерфейса без создания экземпляров - PullRequest
0 голосов
/ 28 мая 2018

В настоящее время я сталкиваюсь с проблемами при интеграции существующего API-интерфейса Java Piketec TPT (http://javadoc.jenkins.io/plugin/piketec-tpt/com/piketec/tpt/api/package-summary.html) в проект Java с использованием Reflection.

TPI Api предоставляет интерфейс под названием "TptApi", который содержит несколькоабстрактные методы, которые используются для доступа к проектам TPT.

Я уже интегрировал другие API, такие как Dox4j-API, где экземпляр класса использовался в качестве цели вызова. Очевидно, это неправильный способ доступаметод из интерфейса.

Моя цель - получить доступ к методу "OpenResult openProject (File f)" из интерфейса TptApi (http://javadoc.jenkins.io/plugin/piketec-tpt/com/piketec/tpt/api/TptApi.html#openProject-java.io.File-).

Мой код:

ClassLoader cl = new URLClassLoader(...);
Map c = new HashMap();

File file = new File("test.prj");

c.put("TptApi", cl.loadClass("com.piketec.tpt.api.TptApi"));
c.put("OpenResult", cl.loadClass("com.piketec.tpt.api.OpenResult"));

//The way I did it with 'normal' classes, not applicable with the interface:
//Object target = ((Class) c.get("TptApi")).newInstance();

OpenResult or = (OpenResult)((Class) c.get("TptApi")).getMethod("openProject", new Class[]{File.class}).invoke(target, new Object[]{_file});

Так как мне получить доступ к абстрактным интерфейсным методам с помощью Reflection?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Мой первоначальный пост не предполагал, что TPT не является необходимым для использования API.Это действительно так.Способ включения API в TPT хорошо документирован, две строки кода, которые вы разместили, тоже в порядке.Проблема, которую я описал, состоит в том, чтобы получить доступ к API с помощью отражения Java .Для других API я мог бы сделать это с помощью «newInstance», чтобы получить доступ к инструменту.При использовании TPT соответствующий объект API является интерфейсом, а не классом, поэтому его невозможно создать.Поэтому я хотел знать, как можно получить доступ к этому конкретному API через рефлексию.

0 голосов
/ 19 ноября 2018

Я только что наткнулся на этот вопрос, поэтому позвольте мне ответить на него, даже если он немного устарел.Я прочитал в ваших комментариях, что вы предполагаете, что вам не нужен инструмент TPT, чтобы использовать API.Это просто неправильно.API - это просто способ связи через RMI с открытым экземпляром TPT.Для подключения к TPT на экземпляре TPT должен быть включен RMI, и вам необходимо знать настраиваемый порт и имя привязки.Вы можете сделать это в настройках «TPT API» или запустить TPT с аргументами командной строки «--apiPort» и «--apiBindingName».Теперь вы можете получить экземпляр TptApi, используя следующие две строки кода:

Registry registry = LocateRegistry.getRegistry(HOST, PORT); // get Server/RMI-Registry
TptApi remoteApi = (TptApi)registry.lookup(BINDING_NAME); // get TPT-API
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...