#java #file #classloading
#java #файл #загрузка классов
Вопрос:
Я хочу загрузить *.class
файлы из файловой системы, которые реализуют интерфейс.
Но я хочу загружать только файлы классов, которые зависят от классов из java.util.*
пакета? Возможно ли это, и если да, то как? Я имею в виду, что можно обнаружить использование незаконных классов, если они создаются динамически? Возможно ли это также при использовании собственного изображения?
Заранее спасибо.
Комментарии:
1. Пожалуйста, посмотрите несколько руководств по загрузчикам классов в Java и попробуйте выполнить некоторый код. Начать нетрудно. baeldung.com/java-classloaders
2. Я знаю, как загружать классы из fs, но не знаю, как обеспечить, чтобы iam загружал только классы с зависимостями от
java.util.*
Ответ №1:
Но я хочу загружать только файлы классов, которые зависят от классов из пакета java.util. *? Возможно ли это, и если да, то как?
Я так думаю.
Загрузчик класса возвращается thatClassInstance.getClassLoader()
. Это загрузчик, .defineClass()
метод которого был вызван для загрузки класса.
Думаю, что в любое время, когда этот класс делает что-либо, связанное с любым другим классом, его загрузчику классов предлагается предоставить указанный класс.
Теперь, как правило, этот загрузчик классов запрашивает у своего родительского загрузчика, загрузил ли он уже этот класс или может ли он загрузить этот класс, и просто возвращает это (и загрузчик этого класса затем используется для всего, что в конечном итоге использует класс). Однако это только потому loadClass
, что метод ClassLoader запрограммирован таким образом. Вместо этого вы можете переопределить его.
Итак, план таков:
Напишите загрузчик классов. Этот загрузит пользовательский класс, который вы хотите загрузить «ограниченно», таким образом, убедитесь, что вы тот, кто вызывает defineClass
. Не переопределяйте FindClass (потому что он вызывается только в том случае, если родительский загрузчик не загрузил этот класс и не может его найти), переопределите loadClass .
Затем ваш loadClass также будет вызываться для всего, что загруженный класс пытается проверить. Таким образом, проверьте имя загружаемого класса. Если это имя вам не нравится, откажитесь от его загрузки. Если это имя вам нравится, попросите parent загрузить его.
Обратите внимание, что кто-то может создать файл с именем Foo.java
, поместить: package java.util; public class Foo {}
inside, а затем попросить ваш загрузчик загрузить java.util.Foo
. Это не очень хороший механизм, чтобы попытаться помешать людям делать неприятные вещи, в принципе, нет безопасного способа запустить код, которому вы не доверяете, на своей собственной виртуальной машине, точка. Если именно поэтому вы хотите это сделать, неважно — вы просто не можете этого сделать.
Комментарии:
1. Но я могу проверить, является ли
java.util.Foo
доверенный класс (его нет), поэтому я мог бы предотвратить неприятные вещи, верно?2. Нет, вы не можете. По крайней мере, вам нужен менеджер безопасности. Есть также способы создать некоторый класс в java.util, который делает что-то от вашего имени, после чего вы отключаетесь. Просто поищите в Интернете целую лавину ошибок безопасности в системе SecurityManager. Если вам нужна такая безопасность, создайте изолированную среду с гипервизором и запустите там виртуальную машину.