Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> forName(); и его использование, никогда не юзал 
:(
    Опции темы
Frog
Дата 16.3.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 11.3.2006
Где: The swamp

Репутация: нет
Всего: нет



Господа,не могли бы вы на простейшем примере обьяснить мне использование метода , forName() - особенно учитывая что приложение будет находиться в джаре , и проходить обфускацию (в том числе и подгружаемый класс). Любой опыт welcome smile
PM MAIL WWW   Вверх
onsh76
Дата 16.3.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 20.11.2005
Где: Beautiful BC

Репутация: нет
Всего: 5



Используя forName метод в сочетании с последующим вызовом newInstance(), можно создать инстанс нужного класса. Классически, экземпляр (инстанс) класса создается с помощью оператора new, например:

Код

com.mydomain.MyClass c = new com.mydomain.MyClass();
...


Ну а можно например и вот так сделать то же самое:

Код

            try {
               Class cls = Class.forName("com.mydomain.MyClass");
               MyClass c = (com.mydomain.MyClass) cls.newInstance();
            }catch (Exception e) {  
               String errMsg = "Unable to instantiate com.mydomain.MyClass class ";
               logger.error(errMsg + "\n Caused by: ", e);
               throw new MyException(errMsg, e);
            }    


Зачастую очень удобно применять модифицированный вариант вышеописанного используя Command pattern. Например:
Код


public interface Command{

   public void execute(String param);
}

class LightOnCommand implements Command {
        
        public void execute( String param) {
               System.out.println("Light is " + param);
        }
}
class LightOffCommand implements Command {
                public void execute( String param) {
                      System.out.println("Light is " + param);
        }
}

public class Client{

   private String className;

   private String param;

   public String getClassName(){
      return className;
   }

   public getParam(){

      return param;
   }

   public void setClassName(String className){
      this.className = className;
   }

   public void setParam(String param){
      this.param = param;

   }

}

public class TestDriver {
        public static void main(String[] args) {
           try {
                   // value object: retains client data
                   Client client = new Client();
                   client.setClassName("LightOnCommand");
                   client.setParam("On"); 
                   // dynamically create appropriate command
               Class cls = Class.forName(client.getClassName());
               Command cmd = (Command) cls.newInstance();
                   // execute command
                   cmd.execute(client.getParam());
             }catch (Exception e) {  
               String errMsg = "Unable to instantiate "  + client.getClassName()  + "  class ";
               logger.error(errMsg + "\n Caused by: ", e);
               throw new MyException(errMsg, e);
            }    
                     
       }
}


Пример очень простой, не хотел переусложнять жизнь... Sorry, если что не так.. smile
PM MAIL   Вверх
3,14
Дата 16.3.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



При использовании обфускатора с применением метода forName, нужно быть осторожнее, зачастую обфускация меняет имена классов, поэтому вызов forName, работавший в оригинале, работать после обфускации не будет.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
batigoal
Дата 16.3.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(3 @ 14, 16.3.2006, 11:35 Найти цитируемый пост)
зачастую обфускация меняет имена классов

А имена публичных классов разве будут изменены? Ведь это сделает работу с классом невозможной. Или это настраивается при обфускации?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
3,14
Дата 16.3.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Цитата(Lamer George @ 16.3.2006, 11:03 Найти цитируемый пост)
А имена публичных классов разве будут изменены? Ведь это сделает работу с классом невозможной. Или это настраивается при обфускации?

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


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Frog
Дата 16.3.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 11.3.2006
Где: The swamp

Репутация: нет
Всего: нет



Большое спасибо вам всем за помощь и советы (особо за примеры кода) , теперь буду эксперементировать , кодить и думать - в вопросе теперь достаточно ясности smile Спасибо.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.