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

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

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


 




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


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

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