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

Поиск:

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



есть класс Person, он содержит разные методы get...() и set...()
get...() возвращают стринги
как можно, зная имя класса, вызвать все методы с префиксом get и выдать строку, содержащую имена методов без get и маленькими буквами? 

например 
методы
getFirstName()
getLastName()


а надо получить стринг "firstname: "+object.getFirstName()+", lastname: "+object.getLastName()
можно ли стринги firstname, lastname как-то автоматически создать из имени метода? 
PM   Вверх
alexadr
Дата 20.8.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

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



Код

        Method[] methods = Person.class.getDeclaredMethods();

        StringBuilder result = new StringBuilder();
        for (Method meth : methods) {
            String methName = meth.getName();
            if (methName.startsWith("get") || methName.startsWith("set")) {
                String name = methName.substring(3);
                result.append(name).append(":\n").append(methName).append("\n");
            }
        }

        System.out.println(result);

PM MAIL   Вверх
ElKa
Дата 20.8.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



alexadr, 

спасибо.. сейчас попробую..  smile 
а если например не все методы надо вызвать, а какие-то определенные,
как создать array с этими методами? 


PM   Вверх
ivg
Дата 20.8.2008, 13:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Есть такая штука - JavaBeans называется.  smile
Код

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BeanTest {

    public static class Person {
        
        private String firstName;
        private String lastName;
        
        public Person(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
        
        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        
    }

    public static String getBeanValues(Object obj)
    throws IllegalAccessException, InvocationTargetException, IntrospectionException {
        BeanInfo bi = Introspector.getBeanInfo(obj.getClass(), obj.getClass().getSuperclass());
        PropertyDescriptor[] descs = bi.getPropertyDescriptors();
        
        StringBuilder sb = new StringBuilder();
        for (PropertyDescriptor desc : descs) {
            Method m = desc.getReadMethod();
            if (m != null) {
                sb.append(desc.getName())
                .append(":")
                .append(m.invoke(obj))
                .append(", ");
            }
        }
        int l;
        if ((l = sb.length()) > 1)
            sb.setLength(l-2);
        return sb.toString();
    }
    
    public static void main(String[] args) throws Exception {
        Person person = new Person("Ivan", "Ivanov");
        System.out.println(getBeanValues(person));
    }
}

PM MAIL   Вверх
alexadr
Дата 20.8.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

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



эээ, не до конца понял сначала вопрос. Вот более прав вариант:
Код

        Person obj = new Person();

        Method[] methods = Person.class.getDeclaredMethods();

        StringBuilder result = new StringBuilder();
        for (Method meth : methods) {
            String methName = meth.getName();
            if (methName.startsWith("get")) {
                String name = methName.substring(3);
                result.append(name).append(":\n").append(meth.invoke(obj)).append("\n");
            }
        }

        System.out.println(result);

PM MAIL   Вверх
ElKa
Дата 20.8.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



ivg, 

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

Добавлено через 2 минуты и 32 секунды
alexadr, 

это я поняла, что там set надо исключить
но если мне например не все методы с get надо, а только например имя и фамилию (там есть еще день рождения, пол и т.д. )
как мне создать array, чтобы его в качестве параметра передавать? 
PM   Вверх
ivg
Дата 20.8.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(ElKa @  20.8.2008,  16:49 Найти цитируемый пост)
проблема в том, что мне надо будет это проделывать не с одним классом, а со многими

public static String getBeanValues(Object obj)
Цитата(ElKa @  20.8.2008,  16:49 Найти цитируемый пост)
т.е. мне надо метод написать, который получает в качестве параметра имя класса или объект Class с этим именем и множество методов этого класса (все или выборочно)
и потом в методе создается Collection всех объектов этого класса и для каждого объекта создается вот такой стринг

А самой разобраться?  smile 

PM MAIL   Вверх
alexadr
Дата 20.8.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

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



Код

package at;

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;
import java.util.HashSet;

public class Person {

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {

        Set<String> methNames = new HashSet<String>();

        methNames.add("Name".toLowerCase());
        methNames.add("SerName".toLowerCase());

        testMethod(methNames);
    }

    private static void testMethod(Set methodNames) throws InvocationTargetException, IllegalAccessException {
        Person obj = new Person();

        Method[] methods = Person.class.getDeclaredMethods();

        StringBuilder result = new StringBuilder();
        for (Method meth : methods) {
            String methName = meth.getName();
            if (methName.startsWith("get")) {
                String name = methName.substring(3);
                if (methodNames.contains(name.toLowerCase())) {
                    result.append(name).append(":\n").append(meth.invoke(obj)).append("\n");
                }
            }
        }

        System.out.println(result);
    }


    public String getName() {
        return "1111";
    }

    public String getSerName() {
        return "2222";
    }

    public String getBirthday() {
        return "3333";
    }

    public void setName(String name) {
        System.out.println(name);
    }
    public void setSerName(String name) {
        System.out.println(name);
    }

    public void setBirthday() {

    }
}

PM MAIL   Вверх
ElKa
Дата 20.8.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



Цитата(ivg @ 20.8.2008,  14:00)
 
А самой разобраться?  smile

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

PM   Вверх
ElKa
Дата 20.8.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



alexadr, 

нет это не то, что мне нужно
у меня есть классы Person, Address, Group...
в них есть методы, которые достают нужные данные из базы данных

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

т.е. я пишу метод getDates(int classInd, boolean allAtr)
в нем для каждого класса

Код

switch{
            case 1: 
             className = "Address";
                        if(allAtr) methods = Address.class.getDeclaredMethods();
                        else methods = ....; // не знаю как создать тогда array 
                        
              break; 
            case 2: 
             className = "Person";
                        if(allAtr) methods = Person.class.getDeclaredMethods();
                        else methods = ....; // не знаю как создать тогда array 
              break;
// ...
}
getDates(Class/className ..., methods);




как мне создать Method[] с выборочными методами, чтобы его передавать как параметр? 
я не знаю, как работать с классом Method  smile 

и можно ли просто стринг с именем класса передавать, или лучше создать объект Class с этим именем и его передать? 

Это сообщение отредактировал(а) ElKa - 20.8.2008, 14:23
PM   Вверх
w1nd
Дата 20.8.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



ElKa, вы уже получили корректный и исчерпывающий ответ на ваш вопрос в сообщении #4


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
ivg
Дата 20.8.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(ElKa @  20.8.2008,  17:23 Найти цитируемый пост)
мне надо написать класс с методом, который получая имя класса и список его методов, вызывает все объекты этого класса и для каждого из них методы из списка
 Где этот метод должен брать все объекты этого класса?
Цитата(ElKa @  20.8.2008,  17:23 Найти цитируемый пост)
как мне создать Method[] с выборочными методами, чтобы его передавать как параметр? 
я не знаю, как работать с классом Method
 alexadr уже показал, что названия методов можно передавать как набор строк.
PM MAIL   Вверх
ElKa
Дата 20.8.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



мне кажется вы не понимаете вопрос 

нужно создать array с объектами класса Method
например у меня есть класс Person с методами getFirstName(), getLastName()
мне нужен array с этими двумя методами
как его создать?

Добавлено @ 14:49
так? 

Код

Method[] methods = new Method[2];

methods[0] = Peson.class.getMethod("getFirstName", new Class[0]);
methods[1] = Peson.class.getMethod("getLastName", new Class[0]);


Добавлено @ 14:50
или 

Код

Method[] methods = new Method[2];
methods[0] = Peson.class.getDeclaredMethod("getFirstName", new Class[0]);
methods[1] = Peson.class.getDeclaredMethod("getLastName", new Class[0]);


Это сообщение отредактировал(а) ElKa - 20.8.2008, 15:07
PM   Вверх
alexadr
Дата 20.8.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

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



если метод getFirstName public, то неважно, а если он private то 
Код

Peson.class.getDeclaredMethod("getFirstName", new Class[0]);

PM MAIL   Вверх
ElKa
Дата 20.8.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: 2
Всего: 4



alexadr, 

спасибо.. теперь все  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.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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