Получить экземпляр объекта по String - PullRequest
5 голосов
/ 23 февраля 2011

Можно ли получить объект, который в коде создается строкой во время выполнения?

Что-то в этом роде:

public String xyz = "aaaa_bbb";

getObject("xyz").some function of String (e.g.: .split("_"))

Спасибо

Ответы [ 5 ]

6 голосов
/ 23 февраля 2011

Вот пример

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

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();
    }



}

Если это локальная переменная метода, которую вы пытаетесь вызвать, тогдавы можете получить доступ к переменной из текущего метода из стека вызовов Thread.currentThread().getStackTrace() возможно.

0 голосов
/ 23 февраля 2011

У меня есть пользовательские компоненты на jPanel, и я хотел бы работать с ними, не перекрашивая их. Я знаю, если я использую список или карту, что это возможно, но я должен изменить значение на карте, а затем перекрасить графический интерфейс с информацией на карте.

0 голосов
/ 23 февраля 2011

Трудно разобрать, что вы спрашиваете, но вы можете получить значения полей по имени, используя отражение.Примерно так:

    Class c = this.getClass();  // or Someclass.class
    Field f = c.getDeclaredField("xyz");
    String value = (String) f.get(this);
    ... = value.split("_");

(я упустил много обработок исключений ...)

Но, как указывает комментарий, если вы действительно пытаетесь реализовать ассоциативнуюмассив, есть лучшие способы сделать это в Java;например, используя Map класс.

0 голосов
/ 23 февраля 2011

Если ваша строка является полем члена вашего объекта, вы можете взглянуть на класс Field.

Однако я должен предупредить вас, что код, которыйВы будете в конечном итоге гораздо дольше, чем вы ожидаете здесь.Действительно, вам придется выполнить некоторые операции:

  1. Получить объект Field, связанный с xyz
  2. Получить метод из его имени и списка параметров (используя в качестве примера Class#getDeclaredMethod(...))
  3. Вызовите метод в этом конкретном экземпляре

Каждый из этих шагов приведет к довольно неясной строке кода со множеством исключений.

Итак, если у вас есть альтернатива, используйте ее!

0 голосов
/ 23 февраля 2011

Возможно, вам придется перефразировать вопрос.

Если вы просто хотите получить строки "aaaa" и "bbb" из исходной строки, вы можете использовать StringTokenizer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...