Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Вопрос по 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
2-1205518291
La-la-Land
2008-03-14 21:11
2008.04.13
Интернет и файлы


2-1206086434
Mishenka
2008-03-21 11:00
2008.04.13
Какие версии Дельфи могут работать с chm ами ?


15-1204196510
Pos Eleptant (c)
2008-02-28 14:01
2008.04.13
Bitmap в Grid


2-1205520894
Vikindos
2008-03-14 21:54
2008.04.13
Как построчно считывать содержимое из файла?


3-1195462325
zdm
2007-11-19 11:52
2008.04.13
Кириллица в данных о пользователе Firebird