изменить класс Java во время выполнения - PullRequest
1 голос
/ 01 мая 2011

Вот мой вопрос. Допустим, есть два класса,

Class A --> in package PA
Class B --> in package PB

Во время компиляции я определяю класс A и класс B.

Теперь, независимо от того, что я определил в классе B во время компиляции, я хочу изменить его на класс A во время выполнения. Я имею в виду, когда класс B загружается во время выполнения, я хочу удалить все определенные атрибуты, методы. и т. д. Затем добавьте все, что определено в классе A, в класс B.

Таким образом, класс B подобен фиктивной копии класса A. И во время выполнения класс B совпадает с классом A, за исключением того, что они находятся в другой упаковке.

Возможно ли это? и как?

1 Ответ

0 голосов
/ 01 мая 2011

Я не думаю, что вы можете изменить загруженный класс. Вы можете прокси-сервер и, таким образом, изменить поведение, но это не изменит загруженный класс, и у вас должна быть возможность вставить свою реализацию в правильную позицию.

Это одна из причин того, что сеттеры иногда / часто лучше, чем вызов new в вашем коде; это дало бы возможность внедрить фиктивный объект (или прокси) вместо реализации времени выполнения.

Я, например, очень рад, что это невозможно (или не должно быть без изменений в JVM), поскольку это было бы огромным нарушением безопасности.

Возможно, вы могли бы добиться аналогичного эффекта, используя специально созданный загрузчик классов, который распознает запрошенный класс и возвращает что-то другое. Хотя это несчастный случай, ожидающий.

...