Я хочу загрузить *.class
файлы из файловой системы, которые реализуют интерфейс.
Но я хочу загружать только файлы классов, которые зависят от классов из пакета java.util.*
? Возможно ли это, и если да, то как? Я имею в виду, что можно обнаружить использование незаконных классов, если они создаются динамически? Это также возможно при использовании собственного изображения?
Заранее спасибо.
Я знаю, как загружать классы из fs, но не знаю, как обеспечить, чтобы iam загружал только классы с зависимостями от java.util.*
Но я хочу загружать только файлы классов, которые зависят от классов из пакета 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
доверенным классом (это не так), поэтому я могу предотвратить неприятные вещи, верно?
Нет, ты не можешь. По крайней мере, вам нужен менеджер по безопасности. Есть также способы заставить какой-либо класс в java.util делать что-то от вашего имени, и в этот момент вы попадаете в шланг. Просто поищите в Интернете огромное количество ошибок безопасности в системе SecurityManager. Если вам нужна такая безопасность, создайте изолированную программную среду с гипервизором и запустите в ней виртуальную машину.
Пожалуйста, просмотрите несколько руководств по загрузчикам классов в Java и попробуйте написать код. Начать не сложно. baeldung.com/java-classloaders