Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический вызов метода 
V
    Опции темы
v2v
Дата 14.1.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



Можно как то сделать:
Код

text="Role";
// вместо 
var.setRole("Administrator") :
// так:
var.set[text]("Administrator");



--------------------
PM   Вверх
DEER
Дата 14.1.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: нет
Всего: 13



Можно использовать вместо объекта Асоциативный массив, но он только для хранения данных
Код

text="Role";
Map myMap = new Hashtable();
myMap.put(text, "Administrator");
.....
myMap.get(text);

А вот чтобы использовать myMap как объект со свойствами и методами, нужно немного поизгаляться и написать свой класс имеющий поле Map и твои методы для работы с ним. например вот 
Код

public class MappedArray {
    //Long to BaseObject
    protected Map idToObject;
    //Integer to BaseObject (тут все элементы)
    protected Map indexToObject;

    public MappedArray(Class valueType) {
        //idToObject = ListOrderedMap.decorate(TypedMap.decorate(new java.util.HashMap(), Long.class, valueType));
        //indexToObject = ListOrderedMap.decorate(TypedMap.decorate(new java.util.HashMap(), Integer.class, valueType));
        idToObject = ListOrderedMap.decorate(new java.util.HashMap());
        indexToObject = ListOrderedMap.decorate(new java.util.HashMap());
    }

    public void add(BaseObject object) {
        if(object.getId() != null) {
            idToObject.put(object.getId(), object);
        }
        object.setIndex(getNextInt(indexToObject.keySet()));
        indexToObject.put(object.getIndex(), object);
    }

    public void remove(Long id) {
        remove((BaseObject)idToObject.get(id));
    }

    public void remove(Integer index) {
        remove((BaseObject)indexToObject.get(index));
    }

    public void remove(BaseObject bo) {
        if(bo != null) {
            idToObject.remove(bo.getId());
            indexToObject.remove(bo.getIndex());
        }
    }

    public void clear() {
        idToObject.clear();
        indexToObject.clear();
    }

    public Collection getElements() {
        return indexToObject.values();
    }

    public BaseObject getElement(Integer index) {
        return (BaseObject)indexToObject.get(index);
    }

    public BaseObject getElement(Long id) {
        return (BaseObject)idToObject.get(id);
    }

    public BaseObject getElementByIndex(int index) {
        return getElement(new Integer(index));
    }

    public BaseObject getElementById(long id) {
        return getElement(new Long(id));
    }

    public boolean isEmpty() {
        return indexToObject.isEmpty();
    }

    public int size() {
        return indexToObject.size();
    }

    //for BeanUtils compability
    public boolean getEmpty() {
        return isEmpty();
    }

    public String toString() {
        return indexToObject.toString();
    }

    public static final Integer getNextInt(Collection col) {
        int max = 0;
        for (Iterator it = col.iterator(); it.hasNext();) {
            Integer ckey = (Integer) it.next();
            max = max < ckey.intValue() ? ckey.intValue() : max;
        }
        return new Integer(max + 1);
    }
}





--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Kangaroo
Дата 14.1.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



v2v, рефлексия?

Код

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class ReflectionTest {
    public static void main(String[] args) {
        try {
            new ReflectionTest().testRole();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public void testRole() throws SecurityException, NoSuchMethodException, 
                    IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Role role = new Role();
        Class<?> roleClass = role.getClass();
        Method setRoleMethod = roleClass.getMethod("setRole", String.class);
        Object[] args = {"Administrator"};
        setRoleMethod.invoke(role, args);
        System.out.println(role.getRole());
    }
}

class Role {
    private String role;

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}



--------------------
Lost....
PM MAIL MSN   Вверх
LSD
Дата 14.1.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(v2v @  14.1.2008,  14:55 Найти цитируемый пост)
Можно как то сделать:

Лучше сделать:
Код

text="Role";
// вместо 
var.setRole("Administrator") :
// так:
var.get(text).set("Administrator");



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
v2v
Дата 14.1.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



Kangaroo, о! похоже то что надо. спасибо.


LSD, а если типы данных разные?

LSD, поздровляю с 10000 сообщением smile

Это сообщение отредактировал(а) v2v - 14.1.2008, 16:25


--------------------
PM   Вверх
LSD
Дата 14.1.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(v2v @  14.1.2008,  16:25 Найти цитируемый пост)
LSD, а если типы данных разные?

Приводить к интерфейсу. Рефлексия последнее дело.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
v2v
Дата 14.1.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



LSD, 
в моём случае интерфейсом скорее всего будет Object ))) ... 
да ловкость рук и никакого мошенничества ... метод и правда очень хорош.... буду иметь ввиду.данкэ.



--------------------
PM   Вверх
LSD
Дата 14.1.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну раз ты знаешь, что у объектов должен быть такой метод, то почему бы его не вынести в интерфейс и реализовать его.
(если это кончно твои объекты, а не сторонние)


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
v2v
Дата 14.1.2008, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



спасибо LSD ваш вариант натолкнул меня на оптимальное решение smile .

Потел, потел; но наконец устал,
От Ларчика отстал
И, как открыть его, никак не догадался;
А Ларчик просто открывался.
И.А.Крылов



--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.