Страница 1 из 1

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

Добавлено: 18 ноя 2014, 19:31
Nyashka
Соответствующий вопрос:
Как получить содержимое статического поля, к примеру такого:

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

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

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

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

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

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

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

Добавлено: 18 ноя 2014, 19:59
Nyashka
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()?

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

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

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

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

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

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