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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 07.01.2013, 13:13   #1
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
По умолчанию Создание внутреннего класса через 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
По умолчанию

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

Вот кусок моего кода:
Код:
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;
}
Carbon вне форума Ответить с цитированием
Старый 07.01.2013, 17:01   #4
Ashabad
Новичок
Джуниор
 
Регистрация: 07.01.2013
Сообщений: 6
По умолчанию

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

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

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

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

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

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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определние локального ( внутреннего )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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS