Является ли Javascript-прототипированием в любом случае достижимым, даже используя Reflection? Могу ли я обернуть свой объект внутри другого, просто чтобы расширить его функциональность одним или двумя способами, не проводя все свои исходные неавтоматические методы в класс обертки, или extends
- это все, что я получаю?Прототипирование в Java вместо расширения
ответ
Я не думаю, что вы можете это сделать на Java. Вы можете хоть в Groovy, используя metaclasses
String.metaClass.world = {
return delegate + " world!"
}
println "Hello".world()
Если вы ищете методы расширения, вы можете попробовать Xtend. Xtend - это язык, который компилируется в Java-код и исключает шаблонный код.
Следующий текст украден из Xtend Docs for extensions:
Добавляя расширение ключевого слова в поле, локальная переменная или объявление параметра, его методы экземпляра становятся методы расширения.
Представьте, что вы хотите иметь определенную функциональность слоя для класса Person. Скажем, вы находитесь в классе, подобном сервлету, и хотите, чтобы он сохранял Person, используя некоторый механизм сохранения. Предположим, что Person реализует общий интерфейс Entity. Вы могли бы иметь следующий интерфейс
interface EntityPersistence {
public save(Entity e);
public update(Entity e);
public delete(Entity e);
}
И если вы получили экземпляр этого типа (через заводской или зависимости инъекций или что когда-либо), как это:
class MyServlet {
extension EntityPersistence ep = Factory.get(typeof(EntityPersistence))
...
}
Вы можете сэкономить, обновлять и удалять любой объект, как это:
val Person person = ...
person.save // calls ep.save(person)
person.name = 'Horst'
person.update // calls ep.update(person)
person.delete // calls ep.delete(person)
я думаю, вы могли бы 'extend' класс или, возможно, обернуть его в [Decorator] (http://en.wikipedia.org/wiki/Decorator_pattern) –
вы можете использовать динамический прокси y API ('java.lang.reflect.Proxy') или библиотеки типа' cglib', которые помогут выполнить то, что вы пытаетесь сделать. Но во всех случаях это будет не так просто, как в «JavaScript». Отражение в «Java» всегда является большой болью, особенно когда вы использовали мир прототипов программирования! – Vadim
Я думаю, вы можете поставить их в ответ. –