Можно ли получить объект, который создается в коде строкой во время выполнения?
Что-то вроде этого:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
Спасибо
Можно ли получить объект, который создается в коде строкой во время выполнения?
Что-то вроде этого:
public String xyz = "aaaa_bbb";
getObject("xyz").some function of String (e.g.: .split("_"))
Спасибо
Вот пример
Если это поле класса, вы можете получить его по имени следующим образом.
import java.lang.reflect.Method;
public class Test {
public String stringInstance = "first;second";
public void Foo() {
try {
Object instance = getClass().getDeclaredField("stringInstance").get(this);
Method m = instance.getClass().getMethod("split", String.class);
Object returnValue = m.invoke(instance, ";");
if(returnValue instanceof String[])
{
for(String s : (String[])returnValue )
{
System.out.println(s);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String a[]){
new Test().Foo();
}
}
Если вы пытаетесь вызвать переменную локального метода, вы можете получить доступ к переменной in из текущего метода из стека вызовов Thread.currentThread().getStackTrace()
возможно.
Трудно понять, что вы спрашиваете, но вы можете получить значения поля по имени, используя отражение. Что-то вроде этого:
Class c = this.getClass(); // or Someclass.class
Field f = c.getDeclaredField("xyz");
String value = (String) f.get(this);
... = value.split("_");
(Я пропустил много обработки исключений...)
Но, как указывает комментарий, если вы действительно пытаетесь реализовать ассоциативный массив, в Java есть лучшие способы сделать это; например используя класс Map
.
Возможно, вам придется перефразировать вопрос.
Если вы просто хотите получить строки «aaaa» и «bbb» из исходной строки, вы можете использовать StringTokenizer
Если ваша строка является полем-членом вашего объекта, вы можете взглянуть на Field
.
Однако я должен предупредить вас, что код, который вы получите, будет намного длиннее, чем вы ожидаете здесь. Действительно, вам придется выполнить некоторые операции:
Class#getDeclaredMethod(...)
)Каждый из этих шагов будет представлять собой довольно непонятную строку кода с кучей генерируемых исключений.
Так что, если у вас есть альтернатива, используйте ее!
У меня есть пользовательские компоненты на jPanel, и я хотел бы работать с ними, не перерисовывая их. Я знаю, что если я использую список или карту, это возможно, но мне нужно изменить значение на карте, а затем перерисовать графический интерфейс с информацией на карте.
HashMap
может делать то, для чего он вам действительно нужен. - person biziclop   schedule 23.02.2011