Ограничить использование класса в загруженных классах

Я хочу загрузить *.class файлы из файловой системы, которые реализуют интерфейс.

Но я хочу загружать только файлы классов, которые зависят от классов из пакета java.util.*? Возможно ли это, и если да, то как? Я имею в виду, что можно обнаружить использование незаконных классов, если они создаются динамически? Это также возможно при использовании собственного изображения?

Заранее спасибо.

Пожалуйста, просмотрите несколько руководств по загрузчикам классов в Java и попробуйте написать код. Начать не сложно. baeldung.com/java-classloaders

markspace 13.12.2020 18:15

Я знаю, как загружать классы из fs, но не знаю, как обеспечить, чтобы iam загружал только классы с зависимостями от java.util.*

TTho Einthausend 13.12.2020 18:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Но я хочу загружать только файлы классов, которые зависят от классов из пакета java.util.*? Возможно ли это, и если да, то как?

Я так думаю.

Загрузчик класса возвращается thatClassInstance.getClassLoader(). Это загрузчик, чей метод .defineClass() был вызван для загрузки класса.

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

Теперь, как правило, этот загрузчик классов спрашивает своего родительского загрузчика, загрузил ли он уже этот класс или может ли он загрузить этот класс, и просто вернет это (и загрузчик ЭТОГО класса затем используется для всего, что в конечном итоге использует этот класс). Однако это только потому, что метод loadClass ClassLoader запрограммирован таким образом. Вместо этого вы можете переопределить его.

Итак, план такой:

Напишите загрузчик классов. Этот загрузит пользовательский класс, который вы хотите загрузить «ограниченно», поэтому убедитесь, что вы вызываете defineClass. Не переопределяйте findClass (поскольку он вызывается только в том случае, если родительский загрузчик не загрузил этот класс и не может его найти), переопределите loadClass.

Затем ваш loadClass также будет вызываться для всего, что пытается проверить загруженный класс. Таким образом, проверьте имя загружаемого класса. Если это имя вам не нравится, откажитесь от его загрузки. Если это имя вам нравится, попросите родителей загрузить его.

Обратите внимание, что кто-то может создать файл с именем Foo.java, поместить: package java.util; public class Foo {} внутрь, а затем попросить ваш загрузчик загрузить java.util.Foo. Это не лучший механизм, чтобы остановить людей от совершения неприятных вещей, по сути, нет безопасного способа запустить код, которому вы не доверяете, на своей собственной виртуальной машине, и точка. Если именно поэтому вы хотите это сделать, не берите в голову — вы просто не можете этого сделать.

Но я могу проверить, является ли java.util.Foo доверенным классом (это не так), поэтому я могу предотвратить неприятные вещи, верно?

TTho Einthausend 13.12.2020 18:34

Нет, ты не можешь. По крайней мере, вам нужен менеджер по безопасности. Есть также способы заставить какой-либо класс в java.util делать что-то от вашего имени, и в этот момент вы попадаете в шланг. Просто поищите в Интернете огромное количество ошибок безопасности в системе SecurityManager. Если вам нужна такая безопасность, создайте изолированную программную среду с гипервизором и запустите в ней виртуальную машину.

rzwitserloot 13.12.2020 19:11

Другие вопросы по теме