java reflection, cast to TreeMap.Entry

 
 
 
Сообщения:31
Добрый !
Не могу разобраться, есть TreeMap<Dog, String> map. Вот это работает:
...
Field field = map.getClass().getDeclaredField("root");
field.setAccessible(true);
Map.Entry<Dog, String> entry = (Map.Entry<Dog, String>)field.get(map);
Dog dog = entry.getKey();

потому что Map.Entry импортируется без проблем. Но я тогда не могу получить доступ к полям Entry<K,V> left; Entry<K,V> right; Entry<K,V> parent;

Вот это не работает:
TreeMap.Entry<Dog, String> entry = (TreeMap.Entry<Dog, String>)fieldRootField.get(map);

потому что The type TreeMap.Entry is not visible.

Такое тоже не работает:
Class<?> class1 = Class.forName("TreeMap$Entry");
Dog dog = class1.cast(fieldRootField.get(map)).getKey();


как можно получить ссылку типа TreeMap.Entry и уже с ее помощью смотреть(отслеживать значения) угодные мне поля ?


p.s. тут получилось сделать вот так, ну скажем чтобы посмотреть TreeMap.Entry left для root узла в дереве:
...
Class<?> class1 = field.getType();
Field[] fields = class1.getDeclaredFields();
fields[2].setAccessible(true);   //  это и есть поле [b]TreeMap.Entry left[/b]  в [b]TreeMap.Entry[/b]
Dog dogLeft = ((Map.Entry<Dog, String>)fields[2].get(field.get(map2))).getKey();
System.out.print("left dog is : " + dogLeft);

но как то неуклюже от такой конструкции. И опять же , все хорошо потому что TreeMap.Entry имплементирует public Map.Entry и мы можем сделать cast к нему. А если бы TreepMap.Entry был просто private class ?
Изменен:14 июл 2019 13:40
 
 
Сообщения:800
Ну вот не захотели разработчики давать пользователям доступ к TreeMap.Entry.left, чтобы не связывать себе руки. А вдруг в будущем им захочется все переделать? И таких мест в стандартной библиотеке Java навалом. Да и в любой библиотеке. Есть интерфейс и есть реализация. Если вы хотите работать с реализацией, склонируйте OpenJDK и играйтесь сколько влезет.
 
 
Сообщения:31
rfq,
Quote:
Ну вот не захотели разработчики давать пользователям доступ к TreeMap.Entry.left

Ну доступ я как видите все равно получу, и если я правильно понимаю с помощью рефлексии можно получить доступ абсолютно к чему угодно. Вопрос в другом , можно ли это сделать удобнее чтоли. То есть не расковырывать каждое field TreeMap.Entry по отдельности, а типа как-то выудить нужный тип ссылки TreeMap.Entry myLink и уже через нее спокойно работать.
Изменен:15 июл 2019 06:43
 
 
Сообщения:800
попробуйте https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/VarHandle.html
 
 
Сообщения:31
Спасибо, правда я пока на 8-й ((
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет