Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 07.01.2013, 13:13   #1
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
Репутация: 10
По умолчанию Создание внутреннего класса через newInstance(). Я начинающий.

Я начинающий. Мой вопрос не носит прикладного характера. Я пытаюсь разобраться в механизме отражения.
Есть класс содержащий внутренний класс.
Код:
public class Proba10_1 
{
	public class InnerClass1
	{
		public InnerClass1()
		{
			System.out.println("InnerClass constructor!");
		}
	}
}
Я пытаюсь извне создать внутренний класс InnerClass1.
Код:
public class Proba10 {
	public static void main(String[] args) 
	{
		Proba10_1 p10_1=new Proba10_1();

			
		Class classP10_1_Inner;
		String thisFormName=p10_1.getClass().getName()+"$InnerClass1";
		
		try 
		{
			classP10_1_Inner=Class.forName(thisFormName);
			Object P10_1_Inner=classP10_1_Inner.newInstance();
		}
		catch (ClassNotFoundException ex) 
		{
			ex.printStackTrace();
		}
		catch (InstantiationException ex) 
		{
			ex.printStackTrace();
		}
		catch (IllegalAccessException ex) 
		{
			ex.printStackTrace();
		}
	}	
}
Вылетает исключение InstantiationException.

Я понимаю, это экзотический случай. Конечно можно было бы в Proba10_1 создать метод, который бы создавал внутренний класс и возвращал его. Просто сейчас я разбираю именно такой случай как я описал - создание экземпляра внутреннего класса извне через механизм отражения.
Ashabad вне форума   Ответить с цитированием
Старый 07.01.2013, 16:10   #2
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
Репутация: 10
По умолчанию

Proba10_1.InnerClass1 example = new Proba10_1().new InnerClass1();
Музыкант вне форума   Ответить с цитированием
Старый 07.01.2013, 16:53   #3
Carbon
JAVA BEAN
Профессионал
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Адрес: Воронеж
Сообщений: 1,334
Репутация: 516

skype: gladkov_3dfan
По умолчанию

Вот кусок моего кода:
Код:
protected static <T> T instantiate(Class<T> clazz)
				throws InstantiationException,
				IllegalAccessException,
				SecurityException,
				NoSuchMethodException,
				IllegalArgumentException,
				InvocationTargetException
{
	T instance = null;

	List<Class<?>> chain = new ArrayList<Class<?>>();

	Class<?> current = clazz;
	while (true)
	{
		chain.add(current);

		if (current.getEnclosingClass() == null
				|| current.isLocalClass()
				|| Modifier.isStatic(current.getModifiers()))
			break;

		current = current.getEnclosingClass();
	}

	Class<?> prevClass = null;
	Object prevInstance = null;
	for (int i = chain.size() - 1; i >= 0; --i)
	{
		Class<?> item = chain.get(i);

		if (item != null)
		{
			Object ins = null;
			if (i == chain.size() - 1)
			{
				try
				{
					Constructor<?> ctor = item.getConstructor();
					ctor.setAccessible(true);
					ins = ctor.newInstance();
				}
				catch (Exception ex)
				{
					ins = item.newInstance();
				}
			}
			else
			{
				Constructor<?> ctor = item.getConstructor(prevClass);
				ctor.setAccessible(true);
				ins = ctor.newInstance(prevInstance);
			}

			prevClass = item;
			prevInstance = ins;

			if (i == 0)
				instance = clazz.cast(ins);
		}
	}

	return instance;
}
__________________
http://i.imgur.com/oCA5O.png
Carbon вне форума   Ответить с цитированием
Старый 07.01.2013, 17:01   #4
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
Репутация: 10
По умолчанию

to Музыкант.
Да, я так тоже делал. Мне интересно создать класс по строке его имени. Мне интересно использовать механизм отражения.
Ashabad вне форума   Ответить с цитированием
Старый 07.01.2013, 17:17   #5
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
Репутация: 10
По умолчанию

to Carbon
Спасибо, Ваш код заработал. Теперь надо его разобрать..
Ashabad вне форума   Ответить с цитированием
Старый 07.01.2013, 18:03   #6
Carbon
JAVA BEAN
Профессионал
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Адрес: Воронеж
Сообщений: 1,334
Репутация: 516

skype: gladkov_3dfan
По умолчанию

Ashabad, он создаёт объекты классов обычных, внутренних (любой вложенности), статических вложенных, даже тех, что внутри метода. Но правда только используя конструктор без параметров.
Если нужно использовать имя, Class.forName("class name")
__________________
http://i.imgur.com/oCA5O.png
Carbon вне форума   Ответить с цитированием
Старый 07.01.2013, 20:48   #7
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
Репутация: 10
По умолчанию

Не сразу сообразил, что конструкторы должны быть объявлены public. Я савсем-савсем начинающий. Кажется пока всё понятно. Спасибо.

Последний раз редактировалось Ashabad; 07.01.2013 в 20:53.
Ashabad вне форума   Ответить с цитированием
Старый 07.01.2013, 21:35   #8
Carbon
JAVA BEAN
Профессионал
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Адрес: Воронеж
Сообщений: 1,334
Репутация: 516

skype: gladkov_3dfan
По умолчанию

Ashabad, не в этом дело.
__________________
http://i.imgur.com/oCA5O.png
Carbon вне форума   Ответить с цитированием
Старый 07.01.2013, 22:43   #9
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
Репутация: 10
По умолчанию

to Carbon.
А в чём? Я что-то упустил?
Ashabad вне форума   Ответить с цитированием
Старый 07.01.2013, 23:45   #10
Carbon
JAVA BEAN
Профессионал
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Адрес: Воронеж
Сообщений: 1,334
Репутация: 516

skype: gladkov_3dfan
По умолчанию

Необязательно. Конструктор может быть и private. Можно проверить.
А не создается объект потому, что в конструктор нужно передать первым параметром (и единственным) объект обрамляющего класса.
__________________
http://i.imgur.com/oCA5O.png
Carbon вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определние локального ( внутреннего )IP Onekey Общие вопросы Delphi 7 03.04.2012 21:50
Создание внутреннего и внешнего серверов. Создание серверов автоматизации. Ann_Sh Помощь студентам 3 09.10.2011 15:53
выполнение команд, через вин-форму, как в ком.строке) ((начинающий)) TheShestov C# (си шарп) 4 07.07.2011 11:53
Создание файла через метод класса Yami_Yami Общие вопросы Delphi 3 26.09.2010 16:15
Создание класса Stanislav Общие вопросы Delphi 8 15.05.2008 23:34


15:53.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.