Вы не можете сделать это. Модель безопасности Java запрещает любому загрузчику классов создавать класс в иерархии «java. *». Это жестко закодировано в собственном коде JVM, поэтому обходного пути нет.
Кроме того, стандартные загрузчики классов следуют модели делегирования, в которой родительский загрузчик классов запрашивает загрузку класса перед попыткой, поэтому вы всегда получаете один и тот же экземпляр класса. Специальные загрузчики классов используются контейнерами приложений для инвертирования этого делегирования для классов приложений.
В любом случае, есть несколько способов сделать это.
Во-первых, TimeZone
является абстрактным классом, и фактическая реализация обычно sun.util.calendar.ZoneInfo
. Так как этого нет в иерархии java. *, Вы можете создать несколько копий в ваших загрузчиках классов.
Во-вторых, вы можете создать подкласс TimeZone
и делегировать все методы экземпляру, предоставленному JVM, добавив при этом свою собственную функциональность. Я использовал это для создания экземпляров TimeZone в некоторых моих приложениях.
В-третьих, поскольку JDK является открытым исходным кодом, вы можете скопировать весь код для TimeZone
и его подклассов в свое собственное приложение, а затем вы можете иметь столько версий класса, сколько захотите.
Если вы хотите изменить TimeZone
экземпляры, возвращаемые статическими методами в TimeZone
, они делегируются на ZoneInfo
, и вам придется использовать отражение, чтобы изменить результат. Если вы знаете Aspect-J или его эквивалент, вы также можете перехватить вызов.