Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Обращение к ClassLoader / 25 сообщений из 31, страница 1 из 2
15.12.2005, 14:56
    #33438366
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Если я делаю a = null;

Wellcome a = new Wellcome();
Wellcome b = new Wellcome();

то обращение к загрузчику происходит только 1 раз.

Можноли как-то заставить его обращатся каждый раз?????
Плз. помогите.
...
Рейтинг: 0 / 0
15.12.2005, 15:35
    #33438499
yuriypalych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Пишешь свой, но не кэшируешь загруженные ранее...
...
Рейтинг: 0 / 0
15.12.2005, 15:39
    #33438513
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
У меня и есть свой!!! Я проверяю еще дло вытягивания из кеша запрос не поступает
...
Рейтинг: 0 / 0
15.12.2005, 18:08
    #33439059
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishУ меня и есть свой!!! Я проверяю еще дло вытягивания из кеша запрос не поступает
Покажите тогда свой ... classloader :)
...
Рейтинг: 0 / 0
15.12.2005, 18:12
    #33439074
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
 import  java.lang.*;
 import  java.lang.reflect.*;
 import  java.util.Hashtable;
 import  java.sql.*;
 import  java.io.*;
 import  org.postgresql.largeobject.*;
 import  org.postgresql.util.*;
 import  org.postgresql.ds.*;
 import  java.net.*;
 import  javax.naming.*;
 import  javax.sql.*;
 import  java.util.*;

/**
 *
 * @author yr
 */
 public   class  sqlClassLoader  extends  ClassLoader{
    
    /** Creates a new instance of sqlClassLoader */
     Hashtable cache =  new  Hashtable();
 
   private  ClassLoader parent =  null ;
   private   Boolean  initialized = false; 
   static   private  Connection conn =  null ;
   private  InitialContext ic =  null ; 
   private  PGPoolingDataSource source =  null ;
   private   Boolean  setcon = false;
 
   public  sqlClassLoader(ClassLoader parent){
   
     super (parent);
     this .parent = parent;
    Properties envl =  new  Properties();
     try {
        
      envl.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
      envl.setProperty( Context.PROVIDER_URL,"file:" +  new  File(".").getAbsolutePath());     
      ic =  new  InitialContext(envl);
       new  org.postgresql.ds.common.PGObjectFactory();
      ic.list("Data");
      
    } catch  (NamingException e) {
             
    }
   
 }
 
  /**
   * Обращение к базе данных
   * @param name
   * @return */
     private   byte [] loadClassData(String name) {
   
     if  (conn ==  null )
         return   null ;
     try  {
       byte  result[] =  null ;
      conn.setAutoCommit(false);
      LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();
      PreparedStatement stmt =
 	 conn.prepareStatement("SELECT object_data FROM client_object WHERE object_name = ?");
         
      stmt.setString( 1 , name);
  
       try {
      ResultSet rs = stmt.executeQuery();
      
       if  (rs.next()){
         int  oid =  0 ;        
        oid = rs.getInt( 1 );
        LargeObject obj = lobj.open(oid, LargeObjectManager.READ);       
        result =  new   byte [obj.size()];
        obj.read(result,  0 , obj.size());        
        obj.close();
        
      }   
      rs.close();
      } catch  (PSQLException e){
         return   null ;
      }
      stmt.close();
      
       return  result;
    }  catch  (SQLException e) {
      e.printStackTrace();
   }
   return   null ;

}

  /**
   * Получить класс из базы данных
   * @param name
   * @return * @throws ClassNotFoundException
   */
   public   Class  loadClass(String name)  throws  ClassNotFoundException  {
      
       return   this .findClass(name);
       
    
  }
   public   synchronized   Class  findClass(String name)  throws  ClassNotFoundException {
     // Получить класс из кэша
   System.out.println(name);
   Object dd =  null ;
    Boolean  s = false;  
    Class  c; 
    try  {           
      dd =  ic.lookup("Data");
       if  (conn !=  null ) {
        s = true;      
      }    
    } catch  (NamingException e) {      
    }
    if  (!s){
   
     c = ( Class ) cache.get(name);
       
      if  (c !=  null ){
          return  c;
     } 
   } 
 
   if  (conn ==  null  || s){
     try  {           
      setcon = true;

      dd =  ic.lookup("Data");  
      ic.unbind("Data");
      cache.clear();
      DataSource source = (DataSource) dd;
      conn = source.getConnection();

    } catch  (NamingException e) {      
    } catch  (SQLException e){   
    }          
  }
  
      byte [] data = loadClassData(name);
       
      if  (data ==  null ) {      
         Class  clazz =  null ;
         try  {    
            String pathName =  name.replace( '.', File.separatorChar ) + ".class";
            pathName =   new  File(".").getAbsolutePath().replace("\\.", "\\build\\classes\\") + pathName;         
            File fl =  new  File(pathName);             
            FileInputStream inFile =  new  FileInputStream( fl );         
             byte [] classBytes =  new   byte [ inFile.available()];
            inFile.read( classBytes );
           
            c = defineClass( name, classBytes,  0 , classBytes.length );
            cache.put(name, c);        
        }  catch  ( java.io.IOException ioEx ) {        
            c =  Class .forName(name);
            cache.put(name, c);         
        }
      
         return  c;
    
       
     }  else  {
      // Класс обнаружен       
      c = defineClass(name, data,  0 , data.length);    
      cache.put(name, c);
       return  c;
    }
  
 
  }
   
  
      static  {
 
          conn =  null ;
          
     }
}

...
Рейтинг: 0 / 0
15.12.2005, 19:58
    #33439300
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Судя по вашему коду, можно сказать что запрос на поиск класса в базе будет поступать каждый раз при попытке ЯВНО загрузить класс (loadClass()). Если я правильно понимаю, в случае с new ЖВМ сама определяет, был ли уже класс загружен текущим класслоадером или нет. Класслоадер, здесь уже не причем.
...
Рейтинг: 0 / 0
16.12.2005, 10:56
    #33439995
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Дык вот вопрос в том и есть что мне нужно при изменении подключения к базе переподтянуть объект.
Если я делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  try {
         Method lc = ClassLoader.getSystemClassLoader().getClass().getMethod("loadClass", pr);  
         lc.invoke(ClassLoader.getSystemClassLoader(), "Wellcome");
         Method ri = ClassLoader.getSystemClassLoader().getClass().getMethod("reInit",  null );  
         ri.invoke(ClassLoader.getSystemClassLoader());        
          Wellcome a =  new  Wellcome();
          a.Wellcome_run();       
      
       } catch (NoSuchMethodException e){
          e.printStackTrace();   
       } catch (IllegalAccessException e){
          e.printStackTrace(); 
       } catch (InvocationTargetException e){
          e.printStackTrace(); 
       } 

То у меня при изменении конекшина вылетает Caused by: java.lang.LinkageError: duplicate class definition: Wellcome

Может есть какието параметры JVM чтобы он не кешировал у себя????
...
Рейтинг: 0 / 0
19.12.2005, 13:28
    #33444085
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Неужели никто подобного не делал????
...
Рейтинг: 0 / 0
19.12.2005, 15:59
    #33444562
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishНеужели никто подобного не делал????
Звучит, так будто вы спрашивали что-то типа: "как вывести в консоль Хелло Ворлд?". :)) Видимо никому еще не понадобилось, то что нужно вам. Кстати, а вам оно зачем? подгружать каждый раз новую версию класса... Как стоит задача? может быть есть обходные пути...
...
Рейтинг: 0 / 0
19.12.2005, 16:31
    #33444663
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Задача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
...
Рейтинг: 0 / 0
19.12.2005, 16:45
    #33444717
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Jozicможет быть есть обходные пути...
Есть стандартные пути, так поступает любой JSP сервер(Tomcat например) когда появляется новая jsp он её перекомпилирует и показывает новый вариант. Достигается это путем того что создается новый экзепляр classLoader.
...
Рейтинг: 0 / 0
19.12.2005, 16:49
    #33444735
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishЗадача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
И для этого надо грузить по новму класс? Почему нельзя использовать для этого разные экземпляры classLoader'а ?
...
Рейтинг: 0 / 0
19.12.2005, 16:52
    #33444753
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Теоретически можно. Но опятьже тогда приходим к проблеме приведения типов.
...
Рейтинг: 0 / 0
19.12.2005, 17:02
    #33444791
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishТеоретически можно. Но опятьже тогда приходим к проблеме приведения типов.
что сполне спокойно решается через интерфейсы загруженные родительским classLoader'ом или reflection
...
Рейтинг: 0 / 0
19.12.2005, 17:08
    #33444811
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Я несказалбы что так уж и спокойно!!! Особенно рефлекшишы
...
Рейтинг: 0 / 0
19.12.2005, 17:19
    #33444851
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishЯ несказалбы что так уж и спокойно!!! Особенно рефлекшишы
А что в них сложного? Тока для параметров методов надо классы и интерфейсы ручками через имя из нужного classLoader по имени вытаскивать.
...
Рейтинг: 0 / 0
19.12.2005, 17:27
    #33444874
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishЗадача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
Несовсем понятно, почему вы выбрали в данном случае хранение байткода в базе, вместо объектов/данных. Если я правильно понял, вы загружаете из базы класс, инстанциируете его и юзаете полученный инстанс (скорее всего по одному и томуже интерфейсу)... Почему не взять инстанс?
Может есть какие-то дополнительные ограничения о которых вы не упомянули?
...
Рейтинг: 0 / 0
19.12.2005, 17:44
    #33444921
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Какбы есть клиенты которые подключаюся к БД. Для того чтобы если происходит обновление системы не нужно было менять класы на всех клиентах то эти класы вытягиваются из БД. Пример MBS Navision если видели конечно :-)
Что вы имеете ввиду под Почему не взять инстанс?
...
Рейтинг: 0 / 0
19.12.2005, 18:44
    #33445065
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishКакбы есть клиенты которые подключаюся к БД. Для того чтобы если происходит обновление системы не нужно было менять класы на всех клиентах то эти класы вытягиваются из БД.
Если я правильно понял, изменяюцца не отдельно взятые классы, а части системы... почему тогда не использовать это как отдельную библиотеку? Клиент скачивает (вытягивает из базы, еще откуда нибудь...) новую версию библиотеки и все начинает работать но уже по новому...
Gold Fish Пример MBS Navision если видели конечно :-)
К сожалению (или к счастью :) - не знаю ) не видел
Gold FishЧто вы имеете ввиду под Почему не взять инстанс?
в свете ваших разъяснений уже не важно :)
...
Рейтинг: 0 / 0
19.12.2005, 18:48
    #33445069
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Есть еще один нюанс который забыл описать. Клиент может подключится к другой базе где будет другой контент. Причем не перезапуская все приложение
...
Рейтинг: 0 / 0
19.12.2005, 20:04
    #33445182
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishЕсть еще один нюанс который забыл описать. Клиент может подключится к другой базе где будет другой контент. Причем не перезапуская все приложение
И нафига так изголятся?
...
Рейтинг: 0 / 0
20.12.2005, 18:11
    #33447504
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Вопрос не в том изврат это или нет, а втом как это сделать
...
Рейтинг: 0 / 0
22.12.2005, 11:37
    #33451360
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Лю-ю-ю-ю-ди-и-и-и!!!!!!! Неужели никто никогда подобные реализации не делал???
Помогите-е-е-е-е!!!!!!!
...
Рейтинг: 0 / 0
26.12.2005, 12:52
    #33457273
Gold Fish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Если я делаю
Код: plaintext
1.
2.
3.
ClassLoader cl = ClassLoader.getSystemClassLoader();
Object dd = cl.loadClass("uakievhrm.StartWindow").newInstance();
StartWindow a = (StartWindow)dd;

то васкакивает
Exception in thread "AWT-EventQueue-0" java.lang.LinkageError: duplicate class definition: StartWindow


Всетаки неужели никто не делал динамическую загрузку
...
Рейтинг: 0 / 0
26.12.2005, 13:07
    #33457313
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к ClassLoader
Gold FishЕсли я делаю
Код: plaintext
1.
2.
3.
ClassLoader cl = ClassLoader.getSystemClassLoader();
Object dd = cl.loadClass("uakievhrm.StartWindow").newInstance();
StartWindow a = (StartWindow)dd;

то васкакивает
Exception in thread "AWT-EventQueue-0" java.lang.LinkageError: duplicate class definition: StartWindow


Всетаки неужели никто не делал динамическую загрузку
Когда вы компилируете этот код, какой класс StartWindow вы используете, где он лежит? И как он в дальнейшем используецца в коде?
Чем отличаецца код класса StartWindow лежащий в одной базе от лежащего в другой? Имеют ли они одинаковый интерфейс???
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Обращение к ClassLoader / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]