Java: указание JVM рассматривать все поля / методы как общедоступные - PullRequest
0 голосов
/ 10 ноября 2018

Я изучаю кодовую базу Java и думаю, что было бы намного проще увидеть, как работает программное обеспечение, если бы я мог временно сделать все поля и методы общедоступными.

Спецификаторы доступа - это, в основном, рекомендации, которым должен следовать программист while he is coding (например, использовать установщик вместо прямого назначения, чтобы позволить установщику выполнять другие действия, связанные с полем). Можно ли сказать jvm игнорировать ограничители доступа при запуске java-программы?

Другой возможностью может быть использование какого-либо плагина IDE, который вручную изменяет видимость всего на public.

Ответы [ 3 ]

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

То, что вы просите, не будет работать на нескольких уровнях.

  1. Вы не можете сделать это на уровне исходного кода / уровня компиляции. Это изменяет язык Java. И это ничего не даст.

  2. Вы не можете делать это любым полезным способом во время выполнения. Вы можете использовать отражение, чтобы сделать поля доступными. Однако это нецелесообразно, потому что:

    • Это должно быть сделано один Field за один раз или один Class за один раз; например,

         Field[] fields = clazz.getDeclaredFields();
         AccessibleObject.setAccessible(fields, true);
      
    • Вы должны будете сохранить все объекты Field, которые были "обработаны", поскольку установка объекта Field в качестве доступного не влияет на другие объекты Field для того же поля.

    • Вы можете использовать это, только если вы изменили свой исходный код для использования отражения и вышеупомянутых Field объектов для доступа к значениям поля.

  3. Если вы пытаетесь понять, как работает ваш код, есть и другие лучшие способы сделать это.

    • Прочитайте и проанализируйте исходный код. Используйте IDE, чтобы помочь вам в этом.
    • Используйте отладчик. Отладчик позволяет видеть состояние переменной независимо от доступа к переменной . И это работает для параметров и локальных переменных, а также полей.
    • Добавьте в ваш код журнал отладки или отпечатки трассировки. (И удалите изменения, когда вы закончите свое расследование. Используйте контроль версий, чтобы помочь вам отменить изменения.)

@ ElliottFrisch Почему это плохая идея?

По сути, потому что это вам не поможет.

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

То, что вы спрашиваете, определенно достижимо, но вызывает некоторые вопросы относительно того, почему вы можете или должны это сделать. Почти всегда есть причина установки модификаторов доступа. Фактически, это может помочь вам лучше понять программное обеспечение, если вы задумаетесь о том, почему определенные поля и методы обнародованы и т. Д.

Недавно я начал новую работу, где мне пришлось пройти через большую кодовую базу и попытаться понять, что все делает. Я обнаружил, что использование Debugger было лучшим способом пройти через код и посмотреть значение каждого поля, переменной и т. Д. В каждой точке программы. Все хорошие Java IDES имеют отладчики. Я использую IntelliJ IDEA , который имеет очень полезный отладчик, который даже позволяет запускать пользовательские операторы оценки в разные моменты работы программы.

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

Это правило считается Государственной изменой Руководством по стилю.

Параметры:

  • Вы все еще можете использовать Java-отражение для установки полей (приватных, финальных или других), но недостатком является то, что вы не можете кодировать, как если бы он был общедоступным, вам все равно придется вызвать какой-то метод, чтобы установить поле для бла .
  • Используйте JNI, который связывает код C с Java, и C действительно не заботится о видимости полей Java.

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




Замечания: Я вполне уверен, что java SecurityManager будет иметь проблемы с вами, пытаясь сделать его данные общедоступными.

...