powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
25 сообщений из 60, страница 2 из 3
ClassLoader и ClassCastException
    #33395210
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно подавить рекурсии при вызове????
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395287
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishКак можно подавить рекурсии при вызове????
exception выкинуть
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395347
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не смешно :-(
Рекурсию при вызове собственного класслоадера в качестве системного
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395407
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fishне смешно :-(
я не шутил
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395425
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто насколько я понял (не особо вникал в тему), то была подобная проблема
при написании своего класслудера и переопределении метода getResourceAsStream
точно сейчас не скажу, что там было, но что-то типа вечной рекурсии.
может и нет.

дак проблема решилась таким способом:
в методе getResourceAsStream:
if (isRecursiveCall()) {
...
}

метод isRecursiveCall():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
      private   boolean  isRecursiveCall() {
         try  {
             throw   new  Throwable();
        }  catch  (Throwable t) {
            StackTraceElement[] ste = t.getStackTrace();
            StackTraceElement caller = ste[ 1 ];
             for  ( int  i =  2 ; i < ste.length; i++) {
                StackTraceElement element = ste[i];
                 if  (element.getClassName().equals(caller.getClassName()) &&
                        element.getMethodName().equals(caller.getMethodName()))
                     return  true;
            }
        }

         return  false;
    }

PS если не в тему - извини
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395478
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет рекурсия не в том месте. Рекурсия при -Dsystem.class.loade=sqlClassLoader.
Подавить удалось через super(sqlClassLoader.class.getClassLoader()); в конструкторе. Но пришли к исходной точке опять ClassCastException или если убрать загружаемый класс из CLASSPATH то NoClassDefFound.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395659
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.out.println(ClassLoader.getSystemClassLoader()); выдает
sqlClassLoader@757aef
но
Welcome w = new Welcome();
всеравно продолжает грузится через
sun.misc.Launcher$AppClassLoader@cc7ad6
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395733
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fish...
Есть клиент который запускается локально, из которого пользователь конектится к БД(под савоим логином и паролем) и только потом начинает тянуть нужные объекты именно оттуда.
Соостветственно отсюда выплывает 2 проблеммы:
1. Объекты клиента должны подгрузится локально. т.к. еще нет соединения с БД
2. загрузчику объектов нужно передать дескриптор соединения.
Так чего тянуть то нужно?? Классы или объекты?
Если классы, то какой смысл их тянуть, если они уже известны?
Если объекты, то зачем тут класслоадер?
Проясните, плиз, ситауцию, а то трудно так вот разобрацца... :)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33396758
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщето классы и объекты это одно и тоже. Или мы с вами о разном говорим?? Для точности классы!!!! Длычего тянуть? 1. Классы могут обновляться, а клиентов много и что-бы не обновлять приложения на каждом клиенте произойдет обновление только в БД и клиенты в процесе работы получат обновленное приложение. 2. В разных БД могут лежать различающиес преложения, для разных целей.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33396936
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishSystem.out.println(ClassLoader.getSystemClassLoader()); выдает
sqlClassLoader@757aef
но
Welcome w = new Welcome();
всеравно продолжает грузится через
sun.misc.Launcher$AppClassLoader@cc7ad6
Текушим у вас являецца sqlClassLoader, но парент его это AppClassLoader (передали в конструкторе).
1. КлассКаст происходит из-за того, что как правильно вы заметили, первый раз его грузит AppClassLoader.При загрузке класса Мейн ваш классдоалер найти его не может и делегирует это своему паренту, Парент же его находит в класспате и более того подгружает все классы, ссылки на которые есть в Мейне (класс Велком соответственно). Потом нужный класс явно загружаецца текущим класслоадером (sqlClassLoader) => ClassCastException.
2. Если класс убрать из класспата, то все происходит точно также, но при загрузке класса Мейн,AppClassLoader найти класс Welcome не может, делегировать это нижележащему лоадеру он не может => NoClassDefFound

Gold FishВообщето классы и объекты это одно и тоже. Или мы с вами о разном говорим?? Для точности классы!!!! Длычего тянуть? 1. Классы могут обновляться, а клиентов много и что-бы не обновлять приложения на каждом клиенте произойдет обновление только в БД и клиенты в процесе работы получат обновленное приложение. 2. В разных БД могут лежать различающиес преложения, для разных целей.
Насчет классов и объектов вы погарячились :)) Или мы совсем о разном говорим :)
Если вы имеете класс (Велком), который явно указан в вашем основном классе (класс-клиент) и который может потом изменится, то грабли вылезут непременно при приведении классов.
В данном случае вас спасет интерфейс или суперкласс, который не будет меняцца...
Ваш класс-клиент( Main ) может выглядеть где-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
         try  {
            IHelloWorld helloWorld =  null ;
             Class  helloWorldClass = myClassLoader.loadClass( className );
            helloWorld = ( IHelloWorld )helloWorldClass.newInstance();
            helloWorld.say();
        }  catch  ( Exception e ) {
            e.printStackTrace();
        }
в параметре className имя любого класса, который имплементит IHelloWorld...

Либо не приводить класс вообще и юзать рефлексию :)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33397019
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishА какой урл я ему укажу?????
Он сам укажет. просто конструктор опиши и смотри как будет работать.
Gold FishУ тебя есть хоть какойто пример работающего класс лоадера????
Есть в томкате org.apache.catalina.loader.WebappClassLoader, надеюсь ты его смотрел как я советовал?
Из комерческого продукта извини дать не могу.

Могу написать SQLClassLoader, за приемлеммую сумму
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33397587
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С URL получилось.
Но проблема в том что Main всеравно грузится Стандартным загрузчиком
c = super.loadClass( name );
все класы которые были загружены так ссылаются на
sun.misc.Launcher$AppClassLoader@cc7ad6
как его можно подменить чтобы ссылался на sqlClassLoader????
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33397776
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishС URL получилось.
Но проблема в том что Main всеравно грузится Стандартным загрузчиком
c = super.loadClass( name );
все класы которые были загружены так ссылаются на
sun.misc.Launcher$AppClassLoader@cc7ad6
как его можно подменить чтобы ссылался на sqlClassLoader????
Зачем вам вообще УРЛ? вы же грузите из базы??
А по поводу Мейн написано на два поста выше. Грузицца он AppClassLoader-ом потому что в базе его (если я правильно понимаю ) нет.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33398182
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
URL при том что я наследую от URLClassLoader
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33398307
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishURL при том что я наследую от URLClassLoader
А зачем вы наследуете от URLClassLoader?? У вас же классы в базе лежат...Чем простой класслоадер не подходит?
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33398330
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да дело не в том от чего наследовать. Дело в том как сказать что Main загрузился sqlClassLoader
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33398394
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jozic Gold FishURL при том что я наследую от URLClassLoader
А зачем вы наследуете от URLClassLoader?? У вас же классы в базе лежат...Чем простой класслоадер не подходит?
В базе лежат не все классы.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33398565
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishДа дело не в том от чего наследовать. Дело в том как сказать что Main загрузился sqlClassLoader
sqlClassLoader может загрузить Main если мейн лежит в базе или еще где-то, где sqlClassLoader будет искать, до того как искать начнет его парент... Где находицца ваш Мейн класс??????

Евгений ПутилинВ базе лежат не все классы.
где лежат не все классы??? Насколько можно понять, они лежат либо в базе либо в класспате...
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33399467
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часть лежит в базе, а часть в classpath. Все положить в базу нереально т.к. подключение к произойдет уже в меине и передастся класс лоадеру. загрузка класов из classpath происходит явным вызовом парента c = super.loadClass(name);
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33399541
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЧасть лежит в базе, а часть в classpath. Все положить в базу нереально т.к. подключение к произойдет уже в меине и передастся класс лоадеру. загрузка класов из classpath происходит явным вызовом парента c = super.loadClass(name);
Где то тоже я и говорил
Jozic
где лежат не все классы??? Насколько можно понять, они лежат либо в базе либо в класспате...
Непонятно все-таки УРЛКлассЛоадер тогда вам зачем? У вас жеж классы не лежат в каких то локациях, который можно достать через УРЛ...

То что все положить в базу не реально, понятно. Что есть в базе грузит SQLClassLoader, остальное стандартный AppClassLoader...

Вы так и не ответили, где лежит ваш Мейн класс?? в базе или в класспате?? Если в класспате, то загрузит его только AppClassLoader...

Покажите, плиз, ваше код (текущее его состояние ) и по возможности укажите что где лежит... может так станет понятнее...
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33399676
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меин в classpath

текущее состояние кода:
Main (ClassPath):
Код: 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.
 import  java.io.*;
 import  java.lang.reflect.Method;
 import  java.sql.*;

/**
 *
 * @author yr
 */
 public   class  Main {
    
    /** Creates a new instance of Main */
     public  Main() {
    }
    
    /**
     * @param args the command line arguments
     */
     public   static   void  main(String[] args) {
        // TODO code application logic here
          try {
       Class .forName("org.postgresql.Driver");
      } catch  (ClassNotFoundException e) {
      e.printStackTrace();
    }
     Runnable wel =  null ; 
     try {
      Connection conn =  DriverManager.getConnection(
      "jdbc:postgresql://127.0.0.1:5432/base",
       "user", "pass");
  
   
  
     sqlClassLoader sql = (sqlClassLoader)ClassLoader.getSystemClassLoader();
  
     sql.setConnection(conn);
       // Загружаем класс
      Object we = sql.retObject("Welcome");
    
     
     Welcome w =  new  Welcome();
     
    
    w = (Welcome) we;
    
    } catch  (SQLException e) {
        e.printStackTrace();
         
    }
 
}

sqlClassLoader(ClassPath):
Код: 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.
 import  java.lang.*;
 import  java.util.Hashtable;
 import  java.sql.*;
 import  java.io.*;
 import  org.postgresql.largeobject.*;
 import  org.postgresql.util.*;
 import  java.net.*;
 import  java.security.*;

/**
 * Загрузчик классов из базы данных
 */

  public   class  sqlClassLoader  extends  URLClassLoader {
   static  Connection conn =  null ;
  
  Hashtable cache =  new  Hashtable();
   private  ClassLoader parent =  null ;
  
 
  public  sqlClassLoader(ClassLoader parent){  
     super ( new  URL[ 0 ], parent);
     this .parent = parent;
  }
 
  /**
   * Обращение к базе данных
   * @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 {
     // Получить класс из кэша
     
      Class  c;
     c = ( Class ) cache.get(name);
	 if  (c !=  null )  return  c;
    // В кэше класс не обнаружен -
    // ищем класс в базе данных
    
        byte [] data = loadClassData(name);
       
     if  (data ==  null ) {
       // Класс в базе данных не обнаружен -
      
       c =  super .loadClass(name);     
       cache.put(name, c);
        return  c;      
     }  else  {
      // Класс обнаружен
     
      c = defineClass(name, data,  0 , data.length);     
      cache.put(name, c);
       return  c;
    }
  }

   public   void  setConnection(Connection conpr){
    conn = conpr;
  }
   public  Object retObject(String name){
    try {
    Object a = loadClass(name).newInstance(); 
     return  a;
   } catch (ClassNotFoundException e){
        return   null ;
   } catch (InstantiationException e){
       return   null ;
   } catch (IllegalAccessException e){
      return   null ;
   }
  
 } 

 }


Welcome (DataBase):
Код: 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.
 import  java.sql.*;
 import  java.io.*;

 public   class  Welcome
{ 
  
  /**
   * 
   * @param conn 
   */
   public   static   void  Wellcome_run(Connection conn)
  {
    String result =  null ;  
    String cp1 =  new  String("_Cp1251_");
    ResultSet rs =  null ;
  
     try {
      
      PreparedStatement stmt =
 	 conn.prepareStatement("select * from official_position");     
      try {   
        rs = stmt.executeQuery();
     } catch  (SQLException e){
       e.printStackTrace();
     } 
         while  (rs.next()) {
           for  ( int  i= 1 ; i <= 1 ; i++){
            result = rs.getString(i);       
           System.out.print(rs.getString( 1 ) + "|"+rs.getString( 2 ));
          }
 }
     
      } catch  (SQLException e) {
        System.out.println(e);
   }
   }
}
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33399826
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При таком раскладе:
Какой смысл наследовацца от УРЛКлассЛоадера и давать ему пустой УРЛ?
ИМХО лишнее ненужное движение

Класс мейн лежит в класспате. Он всегда будет грузицца AppClassLoader-ом , потому как в базе его нет.

Класс велком известен на этапе компиляции, компилятор скомпилит этот класс и положит рядом с Мейн в класспат, если вы его удалите из класспата и положите в базу, то получите NoClassDefFound, так как класс мейн грузицца AppClassLoader, он же сразу пытаецца загрузить и класс Велком. Если класс оставить, то ClassCastException... Про некоторые варианты выхода из данной ситуации я писал раньше.
- Мейн и Велком грузяцца одним и тем же класслоадером. Добицца этого можна засунув мейн в базу, но это я так понимаю совсем не то что нужно...
- Явной ссылки на класс велком в мейне быть не должо: либо интерфейс (суперкласс), который не изменяецца и лежит в класспате, либо рефлексия.

Если вы юзаете опцию -Djava.system.class.loader=SqlClassLoader, то непонятно зачем явно дергаете метод retObject. Этот класс лоадер являецца текущим системным, соответсвенно он и так должне загружать ваш класс Велком из базы.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33399998
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты можеш сделать вместо
Код: plaintext
 new  URL[ 0 ]

Код: plaintext
String cp[]=System.getProperty("java.class.path",".").split(";");

Потом отконвертировать массив строк в массив URL.
Или измени конструктор на
Код: plaintext
1.
2.
3.
4.
  public  sqlClassLoader(URL urk[],ClassLoader parent){  
     super (url, parent);
     this .parent = parent;
  }
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33400152
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Путилинты можеш сделать вместо
Код: plaintext
 new  URL[ 0 ]

Код: plaintext
String cp[]=System.getProperty("java.class.path",".").split(";");

Потом отконвертировать массив строк в массив URL.
Или измени конструктор на
Код: plaintext
1.
2.
3.
4.
  public  sqlClassLoader(URL urk[],ClassLoader parent){  
     super (url, parent);
     this .parent = parent;
  }

Смысл в этом какой? Что это даст? сделать УРЛ Класслоадер и передать ему в урл класспат... AppClassLoader итак будет искать в класспате
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33400763
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос вообще состоит в том как ему после c = super.loadClass(name); вернуть с от имени sqlClassLader, а не AppClassLoader.
Я немогу понять неужели никто подобным не занимался????? Информации по собственным загрузчикам минимум. везде идет newInstance и стоит ... типа дальше и так все понятно, хотя нихрена не работает. Нехочется писать еще и собственное считывание с винта.
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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