Изменить суперкласс класса java с отражением - PullRequest
5 голосов
/ 06 ноября 2011

Можно ли изменить иерархию наследования объектов класса во время выполнения с отражением?

Моя ситуация такова:

SuperClass

MiddleClass расширяет SuperClass

BottomClass расширяет SuperClass

Я хотел бы использовать отражение во время выполнения, чтобы изменить BottomClass для расширения MiddleClass. Это возможно?

БЛАГОДАРЯ

Ответы [ 4 ]

5 голосов
/ 06 ноября 2011

Самое близкое к этому с Java это Instrumentation . В основном вы пишете некоторые классы Java, которым присваивается серия байтов, которые определяют класс, перебираете байтовый код и возвращаете модифицированный байтовый массив файла класса. Затем вы упаковываете эти классы в файл JAR и указываете JVM использовать их либо в командной строке, либо помещая атрибут в файл манифеста файла JAR инструментария.

Конечно, если вы сделаете это, вы захотите использовать некоторую библиотеку манипулирования байтовым кодом, такую ​​как ASM .

EDIT : Если интересующий вас класс реализует интерфейсы, вы можете взглянуть на динамические прокси-классы через java.lang.reflect.Proxy . Это имеет тот недостаток, что части кода, которые вы не написали и которые выполняют new ClassOfInterest(), не затрагиваются, но имеют следующие преимущества:

  1. Быть намного проще, чем модифицировать байт-код классов.
  2. Вы можете динамически выбирать, чтобы разные экземпляры прокси действовали так, как будто они имеют разные суперклассы.
  3. Вам не нужно беспокоиться о SecurityManager проблемах.
4 голосов
/ 06 ноября 2011

Нет, это невозможно с помощью отражения, поскольку отражение используется для анализа существующего кода, а не для его изменения.

0 голосов
/ 06 ноября 2011

это невозможно. Например, если у вас уже есть объект BottomClass и вы пытаетесь изменить суперкласс, что будет с этим объектом?это невозможно ...

0 голосов
/ 06 ноября 2011

Наследование является статическим, поэтому его нельзя изменить во время выполнения.

Однако вы можете сделать SuperClass интерфейсом или использовать делегирование вместо наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...