Объявление метода во время выполнения в java

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

Откуда все это взялось: Я буду читать ввод как;

name=john,age=21
name=smith,age=23

затем мне нужно получить доступ ко всем их значениям "name" и "age" с помощью методов "getname" и "getage".

Однако имя и возрастные слова можно изменить на т.е. фамилия и длина; затем мне нужно получить доступ к их фамилии и длине с помощью методов «getsurname» и «getlength».

Я знаю, что буду использовать invoke для вызова методов getXXX. Но как я могу объявить их во время выполнения? Это настоящая проблема.


person Alaattin KAYRAK    schedule 10.11.2011    source источник
comment
можешь сказать нам, почему ты хочешь это сделать?   -  person James.Xu    schedule 10.11.2011
comment
@ James.Xu Я отредактировал свой вопрос, чтобы объяснить, почему.   -  person Alaattin KAYRAK    schedule 10.11.2011
comment
Зачем нужно вызывать getXXX? Почему бы не сохранить значения в HashMap и не вызвать getMyValue("name")? Если вы не привели упрощенную версию своей проблемы, это стрельба по мухам из пушек ИМХО.   -  person jornb87    schedule 10.11.2011
comment
так что набор методов включает: {getname, getsurname, getlength, getage}, еще? бесконечен ли набор методов? Кажется, вы пытаетесь стрелять из пистолета в комара   -  person James.Xu    schedule 10.11.2011
comment
@ jornb87 На самом деле, если бы это был мой собственный проект, я бы повторил то, что вы сказали. Однако они хотят, чтобы я запрограммировал это, как я сказал.   -  person Alaattin KAYRAK    schedule 10.11.2011
comment
@ James.Xu да, к сожалению, это бесконечно.   -  person Alaattin KAYRAK    schedule 10.11.2011
comment
@AlockLeo .... почему? Для того, чтобы делать что-то слишком сложное, нужна действительно веская причина. Вызов компилятора во время выполнения для выполнения чего-то столь простого, как это, звучит неправильно.   -  person jornb87    schedule 10.11.2011
comment
Я хотел бы также отметить, что создание интерфейсов методов во время выполнения не только само по себе, но и усложняет вызов этих методов (поскольку вызывающий код, очевидно, не может быть скомпилирован с ними). Таким образом, вы усложняете здесь обе стороны.   -  person Thilo    schedule 10.11.2011


Ответы (3)


Вы можете использовать библиотеку генерации байтового кода, такую ​​как ASM, библиотеку фрагментов кода, такую ​​как BeanShell, или использовать Compiler API для компиляции класса во время выполнения.

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

person Peter Lawrey    schedule 10.11.2011

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

person bpgergo    schedule 10.11.2011

Я предполагаю, что вы сможете использовать прокси-классы и, возможно, интерпретатор языка сценариев, который либо написан на Java, либо может взаимодействовать с ним (например, Rhino). Если вам удастся интегрировать его с Rhino, вам, вероятно, придется написать метод на Javascript, но вы все равно сможете получить доступ к любым объектам Java, которые могут вам понадобиться.

person Vlad    schedule 10.11.2011