Java: как получить доступ к подобъекту объекта без метода "getXXX" к этому подобъекту - PullRequest
1 голос
/ 05 октября 2009

Я объясню с фотографиями из Eclipse Debugger

У меня есть класс с именем "FieldContext", (я не могу его редактировать, он скомпилирован в Java OVal API)

Внутри «FieldContext» на вкладке переменной eclipse находятся «CompileTimeType» и «field»

alt text

Q1 Существует ли легенда для значков на вкладке переменных? например, что означает красная коробка с буквой «F» + коробки с желтым бриллиантом?

Теперь я хочу получить доступ к полям внутри объекта «field» (RedBox) .. предпочтительно «name»

alt text

Но у FieldContext нет метода getField (), но есть метод getCompileTimeType ().

Q2 Так есть ли в любом случае, чтобы этот объект поля был классом "SerializableField" из "FieldContext"?

Если отладчик eclipse может их видеть / получать / редактировать, то я надеюсь, что смогу сделать то же самое в Java.

Ответы [ 5 ]

3 голосов
/ 05 октября 2009

Q1: я думаю, желтый означает protected, а красный означает private. «F» означает final.

Q2: Это можно сделать с помощью отражения. Скажем, есть класс C с приватным полем pm, и вы хотите получить доступ к instanceOfC.pm, это путь:

/* exception stuff ommitted (for readability and shortness) */
C instanceOfC = new C();

Class<? extends C> clazz = instanceOfC.getClass();
Field f = clazz.getDeclaredField("pm");
f.setAccessible(true);

... = f.get(instanceOfC);  //<-- this will get you the value of `c.pm`

Вы, вероятно, должны прочитать JavaDoc Класс , Поле и Метод

2 голосов
/ 05 октября 2009

Q1: F означает «окончательный», поэтому содержимое поля не может быть обычно изменено путем прямого доступа с кодом. Желтый бриллиант означает, что это защищенное поле. Красный квадрат означает, что это частное поле. Если бы это был зеленый кружок, это означало бы, что это общедоступно.

Некоторая информация об отладке затмения, которая намного больше, чем просто легенды:

http://www.ibm.com/developerworks/library/os-ecbug/

Q2: Вы можете использовать отражение, чтобы получить доступ к любому полю в классе и вызвать любой метод (если позволяют настройки безопасности). Отражение - это метод, который позволяет вам «анализировать» любой класс и получать доступ к членам по имени.

В Интернете есть несколько руководств по использованию отражения:

http://java.sun.com/docs/books/tutorial/reflect/

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

1 голос
/ 02 апреля 2010

Какую версию OVal вы используете?

Я спрашиваю, потому что класс FieldContext имеет метод getField ():

http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext.html#getField%28%29

Тип возвращаемого значения: java.lang.reflect.Field, который имеет метод доступа getName ():

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html#getName%28%29

Итак, вы, кажется, пытаетесь заново изобрести колесо, используя валун в квадрате:)

Кроме того, если вы не реализуете базовую платформу или не хотите внедрить экстренный взлом, вам следует избегать доступа к закрытым полям с отражением.

Рядовые (могут быть) могут быть изменены в пределах класса включения; защищенные могут быть изменены в дереве наследования; и пакетные, могут быть изменены по вертикали. Автор такого кода не дает никаких гарантий (синтаксически и семантически), если его артефакты доступны посредством отражения.

Связывание вашего кода с помощью отражения - это хороший способ сделать его хрупким и хрупким, как красивая петунья, взорванная ветром сибирской тундры;)

1 голос
/ 05 октября 2009

вы можете попробовать использовать Reflections См. Также это .

1 голос
/ 05 октября 2009

Вам необходимо использовать Reflection API . С этим вы можете делать практически все, что вам нравится с этими полями.

Я не буду обсуждать, должны ли вы или не должны получать к ним доступ, просто вы можете с отражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...