Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по Java   Найти похожие ветки 

 
Семеныч   (2008-02-26 16:56) [0]

В статическом методе класса нужно получить полное имя пакета, в котором содержится данный класс.

Вся проблема в том, что вызов нестатичесого getClass() из статического метода, конечно, не катит.

Гуглил полдня. Не нашел. Но сделать это как-то можно, знаю точно - потому что раньше где-то видел. А вот сейчас понадобилось - и не могу найти.

Знатоки джавы, может, кто подскажет?


 
Семеныч   (2008-02-26 16:59) [1]

А может, имя пакета можно получить и без getClass? Например, через ClassLoader? Все равно как, лишь бы работало в статическом методе.


 
tracy   (2008-02-26 19:40) [2]

MyClass.class.newInstance().getClass().getName()

Чем не спосб?


 
Семеныч   (2008-02-26 20:14) [3]

> tracy   (26.02.08 19:40) [2]

Тем, что MyClass неизвестен. В этом и проблема.

Есть базовый класс, он находится в каком-то пакете. От этого класса порождается множество классов-наследников, каждый из которых находится в своем пакете. Базовый класс содержит статический метод, который должен возвращать имя пакета, содержащего данный класс. И есть большое желание не писать этот метод в каждом наследнике (поскольку MyClass у каждого наследника, понятно, свой), а заставить метод базового класса самого определять класс, через ссылку на который этот метод был вызван.

Если бы этот метод не был статическим, то все просто:
getClass().getPackage().getName();

Но метод должен быть статическим, поэтому getClass() не проходит. Отсюда и вопрос.

ПыСы
Вообще, непонятно, почему отцы-основатели не сделали метод getClass статическим. Казалось бы, никакие поля экземпляра this он не использует, да и вообще ему этот экземпляр по барабану - так на фига ж было вводить такое ограничение?


 
tracy   (2008-02-26 20:47) [4]

Статические методы обычно вызывают довольствуясь именем класса.

Если метод получения пакета класса нужен и впрямь статический, и я правильно понял, что он должен возвращать пакет класса-наследника, то можно вот так сделать, ежели ссылка всегда есть.

В любом случае всегда придется получать инстанс класса для получения имени (для этих целей можно отвести специальный пустой конструктор с параметром какого-нибудь специального созданного для этих целей типа).

Даже если через класс-лоадер загружать, метакласс все-равно через инстанс получать придется (хотя для того чтобы это сделать, нужно опять же знать полное имя класса).


package pkg1;

public class BaseClass
{
public static void main(String[] args) throws Exception
{
 System.out.println(new pkg2.DerivedClass().getPackageName());
 System.out.println(new BaseClass.getPackageNameInternal(new pkg2.DerivedClass(/* indicate empty constructor somehow */)));
}

public static String getPackageNameInternal(BaseClass instance)
{
 String name = instance.getClass().getName();
 return name.substring(0, name.lastIndexOf("."));
}

public String getPackageName()
{
 return BaseClass.getPackageNameInternal(this);
}
}

--------------------------------------------------------------

package pkg2;

import pkg1.BaseClass;

public class DerivedClass extends BaseClass
{
...
}


 
tracy   (2008-02-26 20:50) [5]

Здесь без new не нужен конечно.

System.out.println(new BaseClass.getPackageNameInternal(new pkg2.DerivedClass(/* indicate empty constructor somehow */)));


 
tracy   (2008-02-26 20:58) [6]

В Derived классе ничего связанного с получением пакета не нужно объявлять, как вы понимаете, полиморфизм ибо, ИК.


 
Семеныч   (2008-02-26 21:20) [7]

Сделал так: в базовый класс ввел поле (protected static) и конструктор (public), причем поле инициализируется в конструкторе, а искомый статический метод работает через информацию, записанную в этом поле.

Теперь для того, чтобы все правильно работало, достаточно в любом пакете объявить класс-наследник (совершенно пустой) и один раз создать его экземпляр (даже без сохранения ссылки на этот экземпляр). После этого можно в любом месте пакета сколько угодно раз вызывать искомый статический метод.

Не очень мне нравится такое решение (искусственное оно какое-то), но работает и пока сойдет. А будет время (если будет, LOL) - подумаем, как бы это сделать поэлегантнее.


 
Семеныч   (2008-02-26 21:22) [8]

> tracy   (26.02.08 20:58) [6]

Забыл сказать "спасибо". Говорю.
:o)


 
Kenny   (2008-02-26 21:28) [9]

У меня где-то было реализовано. Завтра посмотрю.


 
Kenny   (2008-02-27 10:50) [10]

А, нет, сори. Там не статический метод :)


 
DiamondShark ©   (2008-02-27 14:18) [11]

А в чём необходимость/полезность такой заморочки?


 
Семеныч   (2008-02-27 18:28) [12]

> DiamondShark ©   (27.02.08 14:18) [11]

В каждом пакете сидит свой файл настроек. Все эти файлы имеют одно и то же имя (то есть, их полные имена различаются только префиксом - именем пакета). Обрабатываются настройки однотипно. И от лени хочется сделать всю их обработку в базовом классе, а в классах-наследниках не писать ни единой строчки. Но для этого надо, чтобы код в базовым классе понимал, с каким пакетом он в данный момент имеет дело (собственно, наследники только для этого и нужны).


 
Kenny   (2008-02-27 19:14) [13]

> Семеныч   (27.02.08 18:28) [12]

Тогда почему именно статический метод?


 
Семеныч   (2008-02-27 19:39) [14]

> Kenny   (27.02.08 19:14) [13]

Обращение рабочего кода к настройкам производится через методы класса, работающего с настройками. Статические методы для этого удобнее - не нужно создавать экземпляр класса. Да и с точки зрения эстетики кода экземпляр тоже не нужен - иметь метаинформацию о себе обязан сам класс.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1205506618
Sesh
2008-03-14 17:56
2008.04.13
Компонент


2-1205522486
DJ_UZer
2008-03-14 22:21
2008.04.13
Подсветка в richedite


2-1205912110
dmitry_12_08_74
2008-03-19 10:35
2008.04.13
Упаковка таблицы Paradox


6-1185174069
andreil
2007-07-23 11:01
2008.04.13
Плагин для IE на Delphi?


2-1205525727
TaHdeR
2008-03-14 23:15
2008.04.13
Как свьязать DataSource и Query?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский