Мы создаем движок, который позволит нам добавлять новые файлы jar всякий раз, загружать эти файлы jar и искать определенные функции и запускать код, который предоставляет эту функциональность. Текущий план - использовать ServiceLoader для этого (просто дополнительная деталь, я не женат на этой идее). На данный момент предположим, что мы полностью контролируем, какие файлы jar будут загружены (большое предположение - я бы предположил, что я в конце концов опубликую кое-что об этом).Запретить вызовы определенным классам в расширениях Java
Учитывая все это, я хотел бы ограничить доступ к этим расширениям определенным классам. Для поддельного примера мы хотим убедиться, что вместо использования java.io.PrintStream
они используют our.better.PrintStreamSolution
.
У меня действительно нет четкого представления о том, что я могу здесь сделать. Поскольку на данный момент у нас есть код, который выйдет в виде расширений, мы могли бы просто провести очень тщательные обзоры кода, но я бы предпочел сделать либо статический анализ во время установки, либо фактически выбросить ошибки во время выполнения. Любая идея, как это можно было бы сделать?
Что не так с ServiceLoader и что лучше/отличным способом получить класс, который реализует определенный интерфейс (или имеет известное имя, я думаю) из банки? – SirPentor
@SirPentor Используется состояние ambient [global]./Возьмите имя своего класса; просмотрите его в своем загрузчике классов (укажите, какой из них); используйте 'asSubclass'; найдите «Конструктор» (не пропустите этот шаг); вызовите 'newInstance'. (Возможны варианты, такие как использование константного поля вместо конструктора.) –