Получить экземпляр объекта по строке

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

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

public String xyz = "aaaa_bbb";

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

Спасибо


person user630447    schedule 23.02.2011    source источник
comment
Рефлексия — это то, чего вы, вероятно, хотите. Но также вероятно, что простой HashMap может делать то, для чего он вам действительно нужен.   -  person biziclop    schedule 23.02.2011


Ответы (5)


Вот пример

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

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() возможно.

person Bala R    schedule 23.02.2011
comment
Привет, я уже реализовал, как и вы, но это моя проблема: m.invoke(stringInstance,;);, stringInstance должен быть строкой, например m.invoke(stringInstance,;) - person user630447; 23.02.2011
comment
Большое спасибо, это то, что я искал - person user630447; 23.02.2011

Трудно понять, что вы спрашиваете, но вы можете получить значения поля по имени, используя отражение. Что-то вроде этого:

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

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

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

person Stephen C    schedule 23.02.2011
comment
У меня есть пользовательские компоненты на jPanel, и я хотел бы работать с ними, не перерисовывая их. Я знаю, что если я использую список или карту, это возможно, но мне нужно изменить значение на карте, а затем перерисовать графический интерфейс с информацией на карте. - person user630447; 23.02.2011
comment
Это должен быть правильный ответ! - person Sarvar Nishonboyev; 17.07.2021

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

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

person Mugur    schedule 23.02.2011

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

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

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

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

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

person Riduidel    schedule 23.02.2011

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

person user630447    schedule 23.02.2011
comment
Это не кажется мне ответом. - person TechNyquist; 30.01.2015