Я пытаюсь использовать библиотеку DNSJava из clojure. Я стараюсь:Доступ к общедоступному методу, определенному в абстрактном базовом классе от Clojure
dmarced.dns> (def results (.run (Lookup. "google.com" Type/TXT)))
#'dmarced.dns/results
dmarced.dns> (def r (get results 0))
#'dmarced.dns/r
dmarced.dns> r
#object[org.xbill.DNS.TXTRecord 0x687a3556 "google.com.\t\t3599\tIN\tTXT\t\"v=spf1 include:_spf.google.com ~all\""]
dmarced.dns> (class r)
org.xbill.DNS.TXTRecord
dmarced.dns> (instance? TXTRecord r)
true
Отлично! Я знаю из docs, что я должен использовать .getStrings для получения содержимого записи.
dmarced.dns> (.getStrings r)
Reflection warning, *cider-repl dmarced*:150:13 - reference to field getStrings can't be resolved.
IllegalArgumentException Can't call public method of non-public class: public java.util.List org.xbill.DNS.TXTBase.getStrings() clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:88)
Ok быстро Google говорит мне, что это может быть решена с помощью намеков типа:
dmarced.dns> (.getStrings ^TXTRecord r)
Reflection warning, *cider-repl dmarced*:153:13 - call to method getStrings on org.xbill.DNS.TXTRecord can't be resolved (argument types:).
IllegalArgumentException Can't call public method of non-public class: public java.util.List org.xbill.DNS.TXTBase.getStrings() clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:88)
Ха. В дальнейшем я ищу Google и читаю полную страницу по адресу interop, но мне не повезло.
Глядя на источник для TXTRecord Я вижу, что он расширяет TXTBase, который является абстрактным классом, где реализован getStrings. Поскольку TXTRecord расширяет его, я должен иметь доступ к getStrings через которые (и я зашел так далеко, чтобы написать программу Java, чтобы проверить его.
Кто-нибудь знает, как я могу получить доступ к этому через Clojure?
EDIT Рабочая программа Java
import org.xbill.DNS.*;
class Main {
public static void main(String [] args) throws TextParseException {
Lookup l = new Lookup("google.com", Type.TXT);
Record [] rs = l.run();
for(int i = 0; i < rs.length; i++) {
TXTRecord tr = (TXTRecord)rs[i];
for(int j = 0; j < tr.getStrings().size(); j ++) {
System.out.println(tr.getStrings().get(j));
}
}
}
}
Ну, 'TXTBase' не объявляется как' public'. Поэтому я не знаю, почему у вас будет доступ к любым методам, объявленным в этом классе вне пакета 'org.xbill.dns'. И это именно то, о чем намекает сообщение об исключении - «Нельзя вызвать публичный метод для ** непубличного ** класса» (выделено мной). Не могли бы вы добавить программу Java, которая работает, чтобы мы могли сравнить с версией Clojure, пожалуйста? –
Добавлено. Оба используют dnsjava 2.1.7 off maven. Я могу предоставить файлы gradle и project.clj, если это необходимо. –