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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Class -> first class object 
V
    Опции темы
Karadul
Дата 18.2.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как получить в яве ссылку на класс и потом вызвать через нее конструктор класса? Т.е.

Код

class Myclass {
    public Myclass()
}

myclass = Myclass;
myclass_instance = new myclass()

PM MAIL   Вверх
jk1
Дата 18.2.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

import java.lang.reflect.InvocationTargetException;

public class Example {

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

        Class<Example> cl = Example.class;
        Example object = cl.getConstructor().newInstance();
        System.out.println(object);
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как передать параметры конструктору?
PM MAIL   Вверх
jk1
Дата 18.2.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

import java.lang.reflect.InvocationTargetException;

public class Example {

    public Example(String param) {
        System.out.println("Initialized with: " + param);
    }

    public static void main(String[] args)
            throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        
        Class<Example> cl = Example.class;
        Example object = cl.getConstructor(String.class).newInstance("test");
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Зачем мне все это нужно: 
Читается в цикле serversocket, принимается соединение и создается обьект с ссылкой на хендлер уже клиентского сокета в качестве параметра. Так пойдет, или можно что-то лучше придумать?

Код

while (sock = serverSocket.accept()) {
    new Thread(new SocketHandler(sock))
}


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

Это сообщение отредактировал(а) Karadul - 18.2.2012, 14:17
PM MAIL   Вверх
Samotnik
Дата 18.2.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Karadul @  18.2.2012,  12:07 Найти цитируемый пост)
Как получить в яве ссылку на класс и потом вызвать через нее конструктор класса? Т.е.

Singleton?

Это сообщение отредактировал(а) Samotnik - 18.2.2012, 14:20
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Samotnik, зачем удалил-то?

Пример можно?

Это сообщение отредактировал(а) Karadul - 18.2.2012, 14:20
PM MAIL   Вверх
Samotnik
Дата 18.2.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Karadul, ты же сказал не то )

Добавлено через 33 секунды
Если четсно не очень понятно что нужно. 
Рефлексия или традиционный вызов?
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Samotnik @  18.2.2012,  14:20 Найти цитируемый пост)
Рефлексия или традиционный вызов? 

Плохо понимаю, что есть что в яве.

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

Это сообщение отредактировал(а) Karadul - 18.2.2012, 14:25
PM MAIL   Вверх
Samotnik
Дата 18.2.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Я тоже плохо понимаю, что тебе нужно smile
Может как то так?
Код

class CallMe {
    
    private static CallMe callMe;
    
    public CallMe() {
        System.out.println("Empty");
    }
    
    public CallMe(int x) {
        System.out.println(x);
    }
    
    public CallMe(int x, int y) {
        System.out.println(x + " " + y);
    }
    
    public CallMe(int x, int y, int z) {
        System.out.println(x + " " + y + " " + z);
    }
    
    public static CallMe getInstance() { // метод вернет всегда ссылочную переменную типа класса
        return callMe;
    }
    
}

public class Main {
    
     public static void main(String[] args) {
        CallMe obj = CallMe.getInstance(); // получаешь, и вызываешь любые конструкторы, сколько душе угодно
        obj = new CallMe();
        obj = new CallMe(1);
        obj = new CallMe(1,2);
        obj = new CallMe(1,2,3);
     } 
   
}


Добавлено через 1 минуту и 22 секунды
По крайней мере этот код удовлетворяет условию:
Цитата(Karadul @  18.2.2012,  12:07 Найти цитируемый пост)
Как получить в яве ссылку на класс и потом вызвать через нее конструктор класса? Т.е.

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


Эксперт
***


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

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



Цитата

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



Karadul,  а что мешает в рантайме определять? обобщение же элементарное

Код

import java.io.File;
import java.lang.reflect.InvocationTargetException;

public class Example {

    static Object[] params = new Object[]{"string", new Long(5), new File("/dev/null")};

    public Example(String str, Long count, File path) {
        System.out.println();
    }

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

        Class<Example> cl = Example.class;
        Class[] types = new Class[params.length];
        for (int i = 0; i < params.length; i++){
            types[i] = params[i].getClass();
        }
        Example object = cl.getConstructor(types).newInstance(params);
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Samotnik @  18.2.2012,  14:33 Найти цитируемый пост)
Я тоже плохо понимаю, что тебе нужно smile
Может как то так?

Не так. Пример смотри в оппосте.

Еще точнее наверно так:
Код

Class ServerAccepter {
    public ServerAccepter (Class socketHandler, int port) {
        serverSocket.bind(port);
        while (sock = serverSocket.accept()) {
            new Thread(new socketHandler(sock))
        }
    }
}

new Thread(ServerAccepter(HandlerType1, 123));
new Thread(ServerAccepter(HandlerType2, 45));




jk1, у тебя params прописаны отдельно. Что произойдет, елси я поменяю сигнатуру конструктора?
PM MAIL   Вверх
jk1
Дата 18.2.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

jk1, у тебя params прописаны отдельно. Что произойдет, елси я поменяю сигнатуру конструктора? 


Тогда и params должны поменяться. Скажите мне вот что: откуда Вы хотите брать реальные значения параметров для передачи конструктору с неизвестной сигнатурой? Они будут приходить по сети? Ну так и снимите с них в рантайме реальные типы, как я снял их со статического массива



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 18.2.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Типы значений - из сигнатуры, реальные значения - из new Thread(new socketHandler(sock)) в примере выше, т.е. из кода. Если они друг другу перестанут соотвествовать, что произойдет?


Это сообщение отредактировал(а) Karadul - 18.2.2012, 15:15
PM MAIL   Вверх
jk1
Дата 18.2.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Если они друг другу перестанут соотвествовать, что произойдет?


Вылетит исключение

Код

Exception in thread "main" java.lang.NoSuchMethodException: ws.Example.<init>()
    at java.lang.Class.getConstructor0(Class.java:2706)
    at java.lang.Class.getConstructor(Class.java:1657)



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 19.2.2012, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот поэтому это решение мне не очень нравится - теряются все преимущества явы как статического языка. Нет ли чего-нибудь получше?

Это сообщение отредактировал(а) Karadul - 19.2.2012, 02:05
PM MAIL   Вверх
Karadul
Дата 19.2.2012, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почему-то никто не подсказал про Factory. Вообще костыльность явы просто поражает.

Код

public class Consumer implements IConsumerFactory {
    @Override
    public IConsumer getConsumer(Socket sock) throws IOException {
        return (IConsumer) new Consumer(sock);
    }
    
    public class Consumer implements IConsumer {
        public Consumer(Socket sock) throws IOException {
            ....
        }
    }
}

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


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Karadul @  19.2.2012,  04:53 Найти цитируемый пост)
Почему-то никто не подсказал про Factory

Потому что нужно формировать задачу яснее  smile 
Цитата(Karadul @  19.2.2012,  04:53 Найти цитируемый пост)
Вообще костыльность явы просто поражает.

что именно является костылём? Одно из основополагающих свойств полиморфизма, когда супер класс может ссылаться на подкласс?
PM MAIL   Вверх
Karadul
Дата 19.2.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Samotnik @  19.2.2012,  13:11 Найти цитируемый пост)
Потому что нужно формировать задачу яснее  smile 

Дык куда уж. Пример кода я дал.


Цитата(Samotnik @  19.2.2012,  13:11 Найти цитируемый пост)
что именно является костылём?

То, что класс - не обьект первого класса, как и функция. А костыли - это фабрики и интерфейсы вместо замыканий.
PM MAIL   Вверх
jk1
Дата 19.2.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Дык куда уж. Пример кода я дал.


... из которого ничего не ясно. Какой-то thread, какой-то socket. Вы хотите на основании пришедших по сокету данных создать объект? Или что? Тогда какие данные будут приходить?
Вы описали бы подробно, что есть в наличии и что надо получить. Тогда и ответ был бы сразу.

Цитата

То, что класс - не обьект первого класса, как и функция.
 

Функций в java нет вообще. А класс все-таки first class object, тут Вы неправы.




--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Karadul
Дата 19.2.2012, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jk1 @  19.2.2012,  18:45 Найти цитируемый пост)
А класс все-таки first class object

Но пользоваться им можно только через ректум.

Собсно говоря, такие костыли сильно путают человека, который к ним не привык - приходится думать не в интуитивно понятных вещах, а хз в чем.

Что еще попалось на глаза - в яве искаропки нет парсера для двоичный форматов с little endian полями, не говоря о смешаных и чего-нибудь вроде zero-terminated строк.

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

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

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


 




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


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

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