powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
60 сообщений из 60, показаны все 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
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
ClassLoader и ClassCastException
    #33400820
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishВопрос вообще состоит в том как ему после c = super.loadClass(name); вернуть с от имени sqlClassLader, а не AppClassLoader.

Извините канешна, но, ЕСЛИ КЛАСС ЗАГРУЖЕН AppClassLoader-ОМ, ТО ОН ЗАГРУЖЕН ИМЕННО AppClassLoader-ОМ. И ВСЕ. ВОПРОС ПОСТАВЛЕН НЕКОРРЕКТНО!!!
Gold FishЯ немогу понять неужели никто подобным не занимался????? Информации по собственным загрузчикам минимум. везде идет newInstance и стоит ... типа дальше и так все понятно, хотя нихрена не работает. Нехочется писать еще и собственное считывание с винта.
ВСЕ ХОРОШО РАБОТАЕТ. Я ВАМ НАСТОЙЧИВО ПРЕДЛАГАЛ ДВА ВАРИАНТА.( больше не буду ). ВОЗМОЖНО ЕСТЬ И ДРУГИЕ... ИНТЕРЕСА РАДИ, Я НАВАЯЛ ТЕСТОВЫЙ КЛАССЛОАДЕР (чтит не из база, а из определенного каталога). ВОСПРОИЗВЕЛ ВАШИ ПРОБЛЕМЫ, РЕШИЛ ИХ ВЫШЕУКАЗАННЫМИ СПОСОБАМИ.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33400954
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понимаю какой смысл приводить его к родителю????? Я смогу юзать методы только родителя (причем не перегруженые насколько я понимаю). Рефлекшины юзать очень не удобно. А ваш класслоадер будет работать и без всех этих извратов т.к. к каталогу он может достучаться сразу, а в моем случае к базетолько после того как юзер утановит соединение с базой
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33400985
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold FishЯ не понимаю какой смысл приводить его к родителю????? Я смогу юзать методы только родителя (причем не перегруженые насколько я понимаю). Рефлекшины юзать очень не удобно.
Эти фразы меня пугают :). имхо вы очень неверно понимаете...
Привидите к интерфейсу и будете юзать то, что достанете из базы, но понятно дело по интерфейсу.
Насчет рефлекшна согласен. Но интерфейс ИМХО здесь именно то, что нужно...
Gold Fish А ваш класслоадер будет работать и без всех этих извратов т.к. к каталогу он может достучаться сразу, а в моем случае к базетолько после того как юзер утановит соединение с базой
Каких извратов? Вы просто не можете засунуть класс мейн в базу, но его и не нужно туда засовывать(это класс-клиент). Я тоже оставляю его в класспате...ситуация одинаковая... гружу класс, который находицца не в класспат. Где, в данном случае не важно.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33401003
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot JozicЯ тоже оставляю его в класспате...ситуация одинаковая... гружу класс, который находицца не в класспат. Где, в данном случае не важно.[/quot]
А каким classLoader'om будет грузиться класс которы статически прилинкован к классу загружаемому вашим classLoader'om?
Человеку четко сказали где смотреть примеры про WebappClassLoader
Он смотрел?

если не понимать как работают classLoader'ы целиком будет тыкаться и ждать когда ему напишут принесут готовый код.

В сети уйма документов и примеров про JDBCClassLoader, в том числе есть книги где он описан.
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33401013
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Путилин JozicЯ тоже оставляю его в класспате...ситуация одинаковая... гружу класс, который находицца не в класспат. Где, в данном случае не важно.
А каким classLoader'om будет грузиться класс которы статически прилинкован к классу загружаемому вашим classLoader'om?
Попытаецца сперва текущим, потом передаст паренту если не найдет, парент будет смотреть в класспате...
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33416679
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Jozic: Можешь кинуть код твоего тестового класс лоадера?????
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33417847
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fish2Jozic: Можешь кинуть код твоего тестового класс лоадера?????
Могу, куда?
Только здаецца мне у вас не в класслоадере проблема то была...
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33417869
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кинь на roodjuriy[at]gmail[dot]com сенкс
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33419058
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold Fishкинь на roodjuriy[at]gmail[dot]com сенкс
вроде ушло...
...
Рейтинг: 0 / 0
ClassLoader и ClassCastException
    #33419071
Gold Fish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо словил
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / ClassLoader и ClassCastException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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