Текущий архив: 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.48 MB
Время: 0.007 c