Class.forName
От: Palmovod  
Дата: 14.09.06 08:06
Оценка:
Что происходит, когда выполняется Class.forName("некоторый класс") ?
Re: Class.forName
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 14.09.06 08:11
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Что происходит, когда выполняется Class.forName("некоторый класс") ?



public static Class<?> forName(String className) throws ClassNotFoundException

Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to:
Class.forName(className, true, currentLoader)

where currentLoader denotes the defining class loader of the current class.

For example, the following code fragment returns the runtime Class descriptor for the class named java.lang.Thread:
Class t = Class.forName("java.lang.Thread")


A call to forName("X") causes the class named X to be initialized.

Parameters:
className — the fully qualified name of the desired class.
Returns:
the Class object for the class with the specified name.
Throws:
LinkageError — if the linkage fails
ExceptionInInitializerError — if the initialization provoked by this method fails
ClassNotFoundException — if the class cannot be located

http://denis-zhdanov.blogspot.com
Re: Class.forName
От: aefimov Россия
Дата: 14.09.06 08:12
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Что происходит, когда выполняется Class.forName("некоторый класс") ?


Ищется класс в ClassLoader, если не найден, то он ищется в текущем класслоадере (в том, которым был загружен тот класс, откуда был вызван этот метот), потом он загружается, инициализируется и отдается. Если не найден — ClassNotFound будет.
Re[2]: Class.forName
От: Palmovod  
Дата: 14.09.06 08:13
Оценка:
Спасибо за цитату из javadoc, но хотелось бы интерпретации на русском
Re[2]: Class.forName
От: Palmovod  
Дата: 14.09.06 08:14
Оценка:
Т.е. если класс найден, то будет создан экземпляр этого класса (включая выполнение конструктора класса, инициализацию полей) ?
Re[3]: Class.forName
От: aefimov Россия
Дата: 14.09.06 08:28
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Т.е. если класс найден, то будет создан экземпляр этого класса (включая выполнение конструктора класса, инициализацию полей) ?


Нет, будет создан instance типа java.lang.Class. Инстанциирование самого загруженного класса.
Чтобы создать из него объект, надо у него дернуть метод newInstance или вытащить constructor и дернуть его.
Re[4]: Class.forName
От: Palmovod  
Дата: 14.09.06 09:43
Оценка:
Вот это я не очень понял

A>Нет, будет создан instance типа java.lang.Class. Инстанциирование самого загруженного класса.
Re[5]: Class.forName
От: aefimov Россия
Дата: 14.09.06 09:52
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Вот это я не очень понял


Есть класс my.acme.A, есть объект класса A — objA.
A objA = new A();

Когда вы скажите:
Class aClass = Class.forName("my.acme.A");


Вы получите объект типа java.lang.Class. Т.е. инстанс самого класса.
То же самое, что и:
my.acme.A.class


А вот чтобы получить objA, то есть сказать ему new вам надо дернуть у него методы newInstance:
A objA = (A)aClass.newInstance();
Re[6]: Class.forName
От: Palmovod  
Дата: 14.09.06 11:24
Оценка:
А с практической т.з. зачем надо делать Class.forName(...) ? Например при использовании JDBC драйвер (класс) загружают именно таким образом. Почему бы просто не создать экземпляр класса?
Re[7]: Class.forName
От: aefimov Россия
Дата: 14.09.06 11:33
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>А с практической т.з. зачем надо делать Class.forName(...) ? Например при использовании JDBC драйвер (класс) загружают именно таким образом. Почему бы просто не создать экземпляр класса?


Его может не быть в classpath, на момент компиляции, вы не знаете какой драйвер вам надо загружать.
К тому же там есть JDBCшный глюк, связанный со статической инициализацией. Драйвер при загрузке должен сам себя прописать (DriverManager.registerDriver). Поэтому делают Class.forName, а драйвер в статическом блоке сам себя создает и прописывает.

Плюс ко всему — это не очень хорошая практика инициализации драйвера.
JDBC дравера лучше указывать в одном месте, в свойстве jdbc.drivers

http://javaalmanac.com/egs/java.sql/LoadDrivers.html
Re[3]: Class.forName
От: ivv  
Дата: 14.09.06 17:00
Оценка:
P>Спасибо за цитату из javadoc, но хотелось бы интерпретации на русском
На русском можно почитать, например, тут:
http://blogs.sun.com/vmrobot/entry/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%B2
Re[8]: Class.forName
От: Аноним  
Дата: 15.09.06 03:02
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Плюс ко всему — это не очень хорошая практика инициализации драйвера.

A>JDBC дравера лучше указывать в одном месте, в свойстве jdbc.drivers
A>http://javaalmanac.com/egs/java.sql/LoadDrivers.html
Забавно, но по ссылке утверждается обратное.
Re[9]: Class.forName
От: aefimov Россия
Дата: 15.09.06 05:54
Оценка:
Здравствуйте, Аноним, Вы писали:

A>>http://javaalmanac.com/egs/java.sql/LoadDrivers.html

А>Забавно, но по ссылке утверждается обратное.

Да, но почему — непонятно.
Хардкодить имена классов и рекумендуют. Странно
Re[10]: Class.forName
От: Metral Россия  
Дата: 15.09.06 06:38
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>>>http://javaalmanac.com/egs/java.sql/LoadDrivers.html

А>>Забавно, но по ссылке утверждается обратное.

A>Да, но почему — непонятно.

A>Хардкодить имена классов и рекумендуют. Странно

Ну, во-первых javaalmanac не является истиной в последней инстанции.
На счет хардкода можно лишь предположить — разработчик может допускать меньше ошибок в коде, нежели пользователь в командной строке.
(Про скрипты запуска я здесь умолчу, ибо это лишь предположение.)
// Artem
/* Walking on water and developing software
from a specification are easy if both are frozen.
(c) Edward V. Berard */
Re[11]: Class.forName
От: aefimov Россия
Дата: 15.09.06 06:57
Оценка:
Здравствуйте, Metral, Вы писали:

M>Ну, во-первых javaalmanac не является истиной в последней инстанции.

M>На счет хардкода можно лишь предположить — разработчик может допускать меньше ошибок в коде, нежели пользователь в командной строке.
M>(Про скрипты запуска я здесь умолчу, ибо это лишь предположение.)

Согласись, то прописать новый драйвер в конфиге файле и положить jar в lib проще, чем менять код?
Re[8]: Class.forName
От: Palmovod  
Дата: 15.09.06 07:48
Оценка:
Т.о. использование Class.forName(...) позволяет обновлять части программы (например в случае с драйверами JDBC) без перекомпиляции самой программы?
Re[12]: Class.forName
От: Metral Россия  
Дата: 15.09.06 09:12
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Согласись, то прописать новый драйвер в конфиге файле и положить jar в lib проще, чем менять код?

Для меня — безусловно
// Artem
/* Walking on water and developing software
from a specification are easy if both are frozen.
(c) Edward V. Berard */
Re[9]: Class.forName
От: zubr Россия  
Дата: 17.09.06 13:01
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Т.о. использование Class.forName(...) позволяет обновлять части программы (например в случае с драйверами JDBC) без перекомпиляции самой программы?


а вы поэкспериментируйте!
создайте класс, запакуйте его в jar, используйте два варианта для получения инстанса класса — hardcoded и dynamic. запустив приложение, обратите внимание на поведение; затем измените свой класс, и вновь скопмилировав и упаковав его в jar, запустите прилоежние вновь (только основное приложение не перекомпилируйте, для чистоты эксперимента). BTW, не забудь-те про classpath

удачи!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.