(Java) Создание методов для нового объекта, созданного с помощью отражения? - PullRequest
0 голосов
/ 05 октября 2011

У меня есть абстрактные методы в классе, которые должны быть реализованы сторонним классом в проекте SEPARATE, который использует мой проект.

- Все экземпляры класса A изначально генерируются с использованием отражения -

Так или иначе, скажем, класс A является абстрактным, а класс B (неабстрактный) расширяет A

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

C также расширяет A, но C имеет только подмножество абстрактных методов в A. C, однако, отсутствует в моей рабочей области.

Следовательно, для каждого абстрактного метода в C, а не в A, мне нужно найти способ добавить метод для A, например:

(для каждого метода)

public <corresponding return type> <missingMethodName>() { return null; }

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

P.S. Пожалуйста, предположите, что я должен либо полностью переписать свой код для синхронизации с объектами, которые я не контролирую, либо реализовать решение, подобное тому, о котором я говорил выше.

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

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

Вы можете добавить эти методы, используя байт-код, но единственное отличиеони сделали бы, чтобы изменить список getDefinedMethods ().Однако это не изменит поведение объектов класса.

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

тихо сложно, но вы можете сделать это с Javassist

Javassist (помощник по программированию Java) - это библиотека Java, предоставляющая средства для манипулирования байт-кодом Java приложения. 1 В этом смысле Javassist обеспечивает поддержку структурного отражения, то есть возможность изменять реализацию класса во время выполнения. Обработка байт-кода выполняется во время загрузки через предоставленный загрузчик классов. http://en.wikipedia.org/wiki/Javassist

0 голосов
/ 05 октября 2011

Нет, если я неправильно читаю вас, то, о чем вы просите, не имеет особого смысла.

Если вы хотите ввести метод

public <corresponding return type> <missingMethodName>() { super.<missingMethodName>(); }

в C, который расширяет A, который не реализует этот метод, что бы он точно делал?

Если вы хотите обеспечить реализацию по умолчанию в A, это нормально, и это не повлияет на C. Если вы добавляете абстрактные методы в A, C должен реализовать их, пометить себя как абстрактный, или он не скомпилируется ( или выбросить сериализацию, или какую-то странную ошибку), если вы запускаете с C, скомпилированным с более старым A.

...