powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
25 сообщений из 60, страница 1 из 3
ClassLoader и ClassCastException
    #33386493
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой тестовый пример:
SqlClassLoader.java:
Код: 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.
 import  java.lang.*;
 import  java.util.Hashtable;
 import  java.sql.*;
 import  java.io.*;
 import  org.postgresql.largeobject.*;
 import  org.postgresql.util.*;

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

  public   class  sqlClassLoader  extends  ClassLoader {

  Hashtable cache =  new  Hashtable();
  Connection conn;

  /**
   * Обращение к базе данных
   * @param name
   * @return */
     private   byte [] loadClassData(String name) {
     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);
      System.out.println(stmt);
       try {
      ResultSet rs = stmt.executeQuery();
      System.out.println("2");
      System.out.println(rs);
       if  (rs.next()){
         int  oid =  0 ;        
        oid = rs.getInt( 1 );
        System.out.println(oid);
        LargeObject obj = lobj.open(oid, LargeObjectManager.READ);       
        result =  new   byte [obj.size()];
        obj.read(result,  0 , obj.size());        
        System.out.println(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   synchronized   Class  loadClass(String name)  throws  ClassNotFoundException {
     // Получить класс из кэша
      Class  c;
     c = ( Class ) cache.get(name);
	 if  (c !=  null )  return  c;
    // В кэше класс не обнаружен -
    // ищем класс в базе данных
    //   System.out.println("1");
        byte [] data = loadClassData(name);
       
     if  (data ==  null ) {
       // Класс в базе данных не обнаружен -
       // выбрасываем исключение
       c = getParent().loadClass( name );
       cache.put(name, c);   
        return  c;
     }  else  {
      // Класс обнаружен
      
      c = defineClass(name, data,  0 , data.length);
      System.out.println(data);
      cache.put(name, c);
       return  c;
    }
  }

   public   void  setConnection(Connection conpr){
    conn = conpr;
  }
}

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

 public   class  Welcome
{ 

   public   static   void  Wellcome_run(java.sql.Connection conn)
  {
    String result =  null ;  
    ResultSet rs =  null ;
  
     try {
      
      PreparedStatement stmt =
 	 conn.prepareStatement("select * from official_position");

      System.out.println(stmt);
     
      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.println(rs.getString( 1 ) + "|"+rs.getString( 2 ));
          }

 }
     
       
      

      } catch  (SQLException e) {
        System.out.println(e);
   }
   }
}

и Main.java:
Код: 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.
 import  java.io.*;
 import  java.sql.*;

/**
 *
 * @author yr
 */
 public   class  Main {
    
    /** Creates a new instance of 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();
    }
     Welcome wel =  null ; 
     try {
      Connection conn =  DriverManager.getConnection(
      "jdbc:postgresql://127.0.0.1:5432/db",
       "user", "pass");
      System.out.println(conn);
   
     try {
     sqlClassLoader sql =  new  sqlClassLoader();
     sql.setConnection(conn);
     // Загружаем класс
      Class  a =  null ;
     a = sql.loadClass("Welcome");
     Object we = a.newInstance(); 
     wel = (Welcome)we;
        
    
     
   } catch (ClassNotFoundException e){
      e.printStackTrace();
     }
   } catch  (SQLException e) {
        e.printStackTrace();
    } catch  (InstantiationException e) {
        e.printStackTrace();
    }
      catch  (ClassCastException e) {
        e.printStackTrace();
    } catch  (IllegalAccessException e) {
        e.printStackTrace();
    } 
    }
}


Проблема в том что в Main.java в строке wel = (Welcome)we; Выдает ClassCastException
в БД точно находится класс Welcome.
Еще если я заменяю
a = sql.loadClass("Welcome");
на a = Class.forName("Welcome"); все работает.
Плз подскажите вчем причина.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33386895
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только что попытался добавить проверку
if ( we instanceof Welcome )
wel = (Welcome)we;
else
System.out.println("Not inst");

он ее не проходит
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33386918
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и еще System.out.println(we.toString());
выдает Welcome@c1b531
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33387171
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishПлз подскажите вчем причина.
Убери свой класс из classpath. Если классы загруженны разными classLoader они разные.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33387573
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непомогло :-(
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33387766
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполни это разные классы
System.out.println(sql.loadClass("Welcome"));
System.out.println(Class.forName("Welcome"));

Если ты убрал Welcome из classPath то тогда у тебя на вот этой строке должен кидаться ClassNotFoundException
wel = (Welcome)we;
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33388531
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вначале когда я удалил этот клас. Он мне всеравно кидал ClassCastException, а после перезагрузки начал кидать ClassNotFoundException.
Я что-то не могу понять как его всетаки заставить работать????
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33389321
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЯ что-то не могу понять как его всетаки заставить работать????
Именно для твоего примера надо чтобы классы Main и Welcome грузились одним classLoader'ом
Достич этого можно несколькими способами
-- заменить истемный класслоадер на свой параметр запуска явы
-Djava.system.class.loader=MyClassLoader
-- грузить Main через sqlClassLoader

Вообще посмотри готовый код где это работает например в томже Tomcat
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33389583
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в таких решениях есть несколько проблем:
1. Мне в загрузчик нужно передать дескриптор подключения к БД
2. Main я не могу загрузить через свой лоадер кроме как с использованием -Djava.system.class.loader=sqlClassLoader. Может я конечно что-то не понимаю?
3. -Djava.system.class.loader=sqlClassLoader выдает ошибку Error occurred durin initialization of VM java.lang.Error: java.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33390151
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть этого в том, что есть клиентская часть которая загружается локально и из нее происходит подключение к нужному серверу БД, а остальные объекты тянутся непосредственно с сервера.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33390722
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishНо в таких решениях есть несколько проблем:
1. Мне в загрузчик нужно передать дескриптор подключения к БД
2. Main я не могу загрузить через свой лоадер кроме как с использованием -Djava.system.class.loader=sqlClassLoader. Может я конечно что-то не понимаю?
3. -Djava.system.class.loader=sqlClassLoader выдает ошибку Error occurred durin initialization of VM java.lang.Error: java.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader)
Можеш. можеш.
Ты должен отталкиватся от URLClassLoader или все классы включая то что лежит в rt.jar грузить через свой classLoader. Но выгоднее всетаки через URLClassLoader и если нет в базе то грузить через super.

Потом посмотри исходные файлы TomCat там есть использования classLoader.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33390882
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно наверное достал. Но что ты имеешь ввиду под Ты должен отталкиватся от URLClassLoader?????
Можно немного поподробнее, я уже просто запутался.
Начнем с самого начала:
Есть клиент который запускается локально, из которого пользователь конектится к БД(под савоим логином и паролем) и только потом начинает тянуть нужные объекты именно оттуда.
Соостветственно отсюда выплывает 2 проблеммы:
1. Объекты клиента должны подгрузится локально. т.к. еще нет соединения с БД
2. загрузчику объектов нужно передать дескриптор соединения.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33391689
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЯ конечно наверное достал. Но что ты имеешь ввиду под Ты должен отталкиватся от URLClassLoader?????
Можно немного поподробнее, я уже просто запутался.
Начнем с самого начала:
Есть клиент который запускается локально, из которого пользователь конектится к БД(под савоим логином и паролем) и только потом начинает тянуть нужные объекты именно оттуда.
Соостветственно отсюда выплывает 2 проблеммы:
1. Объекты клиента должны подгрузится локально. т.к. еще нет соединения с БД
2. загрузчику объектов нужно передать дескриптор соединения.
Тебе нужно чтото типа.
Код: 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.
 public   class  sqlClassLoader  extends  URLClassLoader{
     private   byte [] loadClassData(String name) {
     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);
      System.out.println(stmt);
       try {
      ResultSet rs = stmt.executeQuery();
      System.out.println("2");
      System.out.println(rs);
       if  (rs.next()){
         int  oid =  0 ;        
        oid = rs.getInt( 1 );
        System.out.println(oid);
        LargeObject obj = lobj.open(oid, LargeObjectManager.READ);       
        result =  new   byte [obj.size()];
        obj.read(result,  0 , obj.size());        
        System.out.println(obj.size());
        obj.close();
        
      }   
      rs.close();
      } catch  (PSQLException e){
         return   super .loadClassData(name);
      }
      stmt.close();

       return  result;
    }  catch  (SQLException e) {
      e.printStackTrace();
   }
 return   super .loadClassData(name);
}
}

Твоя основная проблемма в том что ты не доконца представляеш как работает ClassLoader :-)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392144
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты имеешь ввиду java.net.URLClassLoader?????
у него нет метода LoadClassData
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392348
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fishты имеешь ввиду java.net.URLClassLoader?????
у него нет метода LoadClassData
да.
тебе надо переопределить
protected Class findClass(String name) throws ClassNotFoundException. чтобы он искал сначала в SQL базе потом в super.find
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392378
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык он и так ищет

if (data == null) {
c = getParent().loadClass( name );
cache.put(name, c);
return c;
}
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392619
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fishдык он и так ищет

Ага понял. Ты его переопредели от URLClassLoader, сделай конструктор по умолчанию(у тебя на его отсуствие ошибка была java.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader) Сделай static Connection conn;
И попробуй с тем чтобы он был системным classLoader'om
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392800
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переопредделил от URLClassLoader и создал конструктор по умолчанию. И всеравно дает ava.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33392994
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishПереопредделил от URLClassLoader и создал конструктор по умолчанию. И всеравно дает ava.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader)
Хм он вот это хочет :-(

sqlClassLoader (ClassLoader parent)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33393064
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И че делать???
Я пробовал наследовать от ClassLoader и SecureClassLoader тоже дает.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33393170
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishИ че делать???
Я пробовал наследовать от ClassLoader и SecureClassLoader тоже дает.
Он конструктор хочет sqlClassLoader (ClassLoader parent)
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33393253
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну смертвой точки уже удалось сойти.
Теперь новые проблемы.
Если я наследую от УРЛКлассЛоадер и в конструкторе инициализирую как super(null, parent); вылазит NullPointerException при инициализации ВМ, а если я наследую от КлассЛоадер или СекьюриКлассЛоадер то при запуске ругается на рекурсивный вызов
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33394254
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33394992
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishНу смертвой точки уже удалось сойти.
Теперь новые проблемы.
Если я наследую от УРЛКлассЛоадер и в конструкторе инициализирую как super(null, parent); вылазит NullPointerException при инициализации ВМ, а если я наследую от КлассЛоадер или СекьюриКлассЛоадер то при запуске ругается на рекурсивный вызов

А ты попробуй наследоваться от УРЛКлассЛоадер и переопределить только его конструкторы, т.е. вызывать не super(null, parent) а super(url, parent)
Все таки советую поискать в сети как минимам есть классы JDBCClassLoader
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33395130
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой урл я ему укажу?????
У тебя есть хоть какойто пример работающего класс лоадера???? Что-то в сети по класс лоадерам вообще фанарь информации!!!!
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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