2013-10-07 5 views
5

Итак, для этого проекта я пытаюсь расширить класс во время выполнения. Что бы я хотел знать, возможно ли это? Если да, то как мне это сделать? Есть ли там библиотеки для этих вещей?Расширение класса во время выполнения

+0

Почему бы вам не хотеть этого? Просьба уточнить прецедент. Я сомневаюсь, что это возможно. –

ответ

4

CGLib - это библиотека, которую вы ищете. Он довольно мощный в расширении классов или реализации интерфейсов во время выполнения, поэтому многие популярные фреймворки, такие как Spring или Hibernate, используют его.

Вы можете создать расширение класса с кодом, как

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

хотя вы, вероятно, заменить NoOp обратный вызов с полезным методом перехватчика с требуемой логикой.

+0

Awesome, спасибо! – PaulBGD

1

Да, во время выполнения можно расширить класс. Попробуйте библиотеку, способную модифицировать байт-код во время выполнения, например, javassist или ASM.

0

Ответ зависит от того, что вы имеете в виду под «расширить класс». В java «extend» означает объявление другого класса, который расширяет первый (является подклассом). Поэтому, если вы хотите создать подкласс данного класса, это возможно - просто подготовьте массив байтов, представляющий подкласс, и передайте его загрузчику класса.

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

+0

Я просто хотел динамически выбирать, какой класс расширять (поскольку classpath к классу постоянно изменяется). – PaulBGD

Смежные вопросы