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

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

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

Можноли как-то заставить его обращатся каждый раз?????
Плз. помогите.
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33438499
yuriypalych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишешь свой, но не кэшируешь загруженные ранее...
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33438513
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня и есть свой!!! Я проверяю еще дло вытягивания из кеша запрос не поступает
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33439059
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishУ меня и есть свой!!! Я проверяю еще дло вытягивания из кеша запрос не поступает
Покажите тогда свой ... classloader :)
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33439074
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Обращение к ClassLoader
    #33439300
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по вашему коду, можно сказать что запрос на поиск класса в базе будет поступать каждый раз при попытке ЯВНО загрузить класс (loadClass()). Если я правильно понимаю, в случае с new ЖВМ сама определяет, был ли уже класс загружен текущим класслоадером или нет. Класслоадер, здесь уже не причем.
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33439995
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык вот вопрос в том и есть что мне нужно при изменении подключения к базе переподтянуть объект.
Если я делаю так:
Код: 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
Обращение к ClassLoader
    #33444085
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели никто подобного не делал????
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444562
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishНеужели никто подобного не делал????
Звучит, так будто вы спрашивали что-то типа: "как вывести в консоль Хелло Ворлд?". :)) Видимо никому еще не понадобилось, то что нужно вам. Кстати, а вам оно зачем? подгружать каждый раз новую версию класса... Как стоит задача? может быть есть обходные пути...
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444663
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444717
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jozicможет быть есть обходные пути...
Есть стандартные пути, так поступает любой JSP сервер(Tomcat например) когда появляется новая jsp он её перекомпилирует и показывает новый вариант. Достигается это путем того что создается новый экзепляр classLoader.
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444735
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЗадача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
И для этого надо грузить по новму класс? Почему нельзя использовать для этого разные экземпляры classLoader'а ?
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444753
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически можно. Но опятьже тогда приходим к проблеме приведения типов.
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444791
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishТеоретически можно. Но опятьже тогда приходим к проблеме приведения типов.
что сполне спокойно решается через интерфейсы загруженные родительским classLoader'ом или reflection
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444811
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я несказалбы что так уж и спокойно!!! Особенно рефлекшишы
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444851
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЯ несказалбы что так уж и спокойно!!! Особенно рефлекшишы
А что в них сложного? Тока для параметров методов надо классы и интерфейсы ручками через имя из нужного classLoader по имени вытаскивать.
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444874
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЗадача(в упрощенном виде) в том что есть некая форма с JDesctopPane которая загружается локально а есть некоторые JInternalFrame корые лежат в БД, и в разных БД они могут быть разные(т.е. с одинаковым именем но разным контентом).
Т.е. у пользователя после того как он подключается к базе выскакивает JInternalFrame который лежит в базе, если пользователь переподключился к другой базе (не перегружая приложение) то у него открывается это фрейм из текущей базы
Несовсем понятно, почему вы выбрали в данном случае хранение байткода в базе, вместо объектов/данных. Если я правильно понял, вы загружаете из базы класс, инстанциируете его и юзаете полученный инстанс (скорее всего по одному и томуже интерфейсу)... Почему не взять инстанс?
Может есть какие-то дополнительные ограничения о которых вы не упомянули?
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33444921
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какбы есть клиенты которые подключаюся к БД. Для того чтобы если происходит обновление системы не нужно было менять класы на всех клиентах то эти класы вытягиваются из БД. Пример MBS Navision если видели конечно :-)
Что вы имеете ввиду под Почему не взять инстанс?
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33445065
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishКакбы есть клиенты которые подключаюся к БД. Для того чтобы если происходит обновление системы не нужно было менять класы на всех клиентах то эти класы вытягиваются из БД.
Если я правильно понял, изменяюцца не отдельно взятые классы, а части системы... почему тогда не использовать это как отдельную библиотеку? Клиент скачивает (вытягивает из базы, еще откуда нибудь...) новую версию библиотеки и все начинает работать но уже по новому...
Gold Fish Пример MBS Navision если видели конечно :-)
К сожалению (или к счастью :) - не знаю ) не видел
Gold FishЧто вы имеете ввиду под Почему не взять инстанс?
в свете ваших разъяснений уже не важно :)
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33445069
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще один нюанс который забыл описать. Клиент может подключится к другой базе где будет другой контент. Причем не перезапуская все приложение
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33445182
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЕсть еще один нюанс который забыл описать. Клиент может подключится к другой базе где будет другой контент. Причем не перезапуская все приложение
И нафига так изголятся?
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33447504
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не в том изврат это или нет, а втом как это сделать
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33451360
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лю-ю-ю-ю-ди-и-и-и!!!!!!! Неужели никто никогда подобные реализации не делал???
Помогите-е-е-е-е!!!!!!!
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33457273
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


Всетаки неужели никто не делал динамическую загрузку
...
Рейтинг: 0 / 0
Обращение к ClassLoader
    #33457313
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 31, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Обращение к ClassLoader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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