получить статическое без инстанса

Ответить
Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

получить статическое без инстанса

Сообщение Nyashka » 18 ноя 2014, 19:31

Соответствующий вопрос:
Как получить содержимое статического поля, к примеру такого:

Код: Выделить всё

class Foo {
public static String NAME = "Boo";
}
если у тебя нет инстанса этого класса, а так же нету информации о нем, кроме ссылки на его класс взятой через

Код: Выделить всё

Class <Object> fooClass = Foo.getClass();
т.е. нет самого класс под рукой что бы спросить Foo.NAME? Создание инстанса напомню дорогостоящая операция, которую я хотел бы избежать

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: получить статическое без инстанса

Сообщение Mikhail_dev » 18 ноя 2014, 19:45

Инстанс класса всё равно неявно создастся, ибо обращение к статической переменной, которая находится к классе - это и есть обращение к объекту класса, в котором есть данная переменная. Java машина создаст такой экземпляр при первом обращении к такому классу (Foo.getClass()), так что не вижу смысла делать какие-то извраты.
И я не совсем понял вопрос. Вы хотите получить содержимое статического поле, о котором ничего неизвестно? (иначе почему не вызвать сразу Foo.NAME ?)

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: получить статическое без инстанса

Сообщение Nyashka » 18 ноя 2014, 19:59

Mikhail_dev писал(а):И я не совсем понял вопрос. Вы хотите получить содержимое статического поле, о котором ничего неизвестно? (иначе почему не вызвать сразу Foo.NAME ?)
Представьте что у вас есть 30-40 классов выполняющих некоторую унифицированную работу. Вы не хотите писать для каждой из них что то вроде

Код: Выделить всё

if (Foo.NAME.contentEquals(giftClassName) {
	//smthng
})
а потому создаете интерфейс SomeInterface с методом getName(); наследуете их всех, и помещает их всех в 1 список что бы делать

Код: Выделить всё

for (SomeInterface myClass : lstClasses) {
	if (myClass.getName().contentEquals(giftClassName)) {
		//do smthng
	}
}
А теперь представьте что у вас нет инстансов, но есть только список описаний этих самых классов? Как тогда получить их имя если самого инстанса класса нет, и нельзя вызвать getName()?

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: получить статическое без инстанса

Сообщение Nyashka » 18 ноя 2014, 20:19

В вопросе замешана абстрактная фабрика которая по имени объекта создает его инстанс. Хранить сами инстансы ей смысла особого нет, поэтому у нее есть просто список описаний классов, инстансы которых она может создать. Когда ей дают имя она должна сравнить его с именем класса, а так же с ее укороченным "пользовательским" названием которое хранится в статическом поле каждого из этих классов, и если оно совпадает вернуть созданный ею инстанс. Думаю так должна быть понятна и причина такого подхода, и необходимость сделать все не создавая инстанс

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: получить статическое без инстанса

Сообщение Nyashka » 19 ноя 2014, 14:46

Хм... Я неправильно задал вопрос, или на него нету ответа? Еще раз попробую коротко изложить суть:
Необходимо получить содержимое статического поля некого класса, ссылка на который (подчеркну, ссылка на класс, а не на экземпляр класса) нам была дана. Имя поля известно, так что имея инстанс класса (его экземпляр) я мог бы написать myClass.getDeclaredField("NAME"), и вынуть его содержимое. Попросту - создать инстанс и сделать именно так - плохо (кстати говоря пока так и есть), потому что лишний раз создается объект, иногда огромного размера, что в рантайме будет убивать производительность. Поэтому я расчитываю на то что кому то известны приемы обращения с классом предоставляющим доступ к статическим полям, даже если вы не создавали инстанс этого класса.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: получить статическое без инстанса

Сообщение Nyashka » 19 ноя 2014, 16:05

Всем спасибо, еще час гугления подсказал таки ответ:
Для получения статического поля достаточно было передать параметром null в качестве инстанса

Ответить