Если безопасность является проблемой, действительно ли безопасно использовать отражение для запуска методов [...] или было бы предпочтительнее просто жестко закодировать вызовы имен методов?
Как правило, предпочтительнее НЕ использовать отражение.Ваше приложение будет быстрее, проще (например, меньше строк кода) и будет менее хрупким (например, с меньшей вероятностью выбросить непроверенные исключения), если вы будете использовать обычные (не отражающие) вызовы.Лучше всего использовать отражение только тогда, когда более простые подходы не будут работать.
Безопасность отражения также является потенциальной проблемой.
Если ваша JVM работает ненадежно или неизвестнокод, который может пытаться делать плохие вещи, тогда API-интерфейсы отражения в целом предлагают много возможностей делать плохие вещи.Например, он позволяет плохому коду вызывать методы и обращаться к полям, которые не позволят компилятору Java.(Он даже позволяет коду совершать злые вещи, такие как изменение значения атрибутов final
и других вещей, которые обычно считаются неизменяемыми.)
Даже если ваша JVM работает полностьюДоверяемый код, все еще возможно, что недостаток проекта или проблема безопасности на уровне системы могут позволить хакеру внедрить имена классов или методов.Затем API-интерфейсы отражения будут покорно пытаться вызвать неожиданные методы.
Если отражение является потенциальной проблемой, как можно предотвратить его?
Чтоэто просто.Приложению требуются различные разрешения для успешного вызова соответствующих чувствительных к безопасности методов в API отражений.Эти разрешения по умолчанию предоставляются доверенным приложениям, а не изолированным приложениям.Вы можете настраивать их.
Простое решение: если вы используете доверенный код или если вас беспокоит возможность ошибок проектирования, связанных с безопасностью, запустите весь соответствующий код в изолированной программной среде безопасности, которая предотвращает использованиеAPI отражения.(Недостатком является то, что некоторые сторонние библиотеки спроектированы исходя из предположения, что они могут использовать отражение ... и будут ломаться в песочнице.)
(По-видимому, нет проверки прав доступа для фактического Method.invoke(...)
вызов. Проверка происходит раньше, когда код приложения получает объект Method
из Class
.)