|
|
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Есть такой тестовый пример: 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. 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. и 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. Проблема в том что в Main.java в строке wel = (Welcome)we; Выдает ClassCastException в БД точно находится класс Welcome. Еще если я заменяю a = sql.loadClass("Welcome"); на a = Class.forName("Welcome"); все работает. Плз подскажите вчем причина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 12:12 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Только что попытался добавить проверку if ( we instanceof Welcome ) wel = (Welcome)we; else System.out.println("Not inst"); он ее не проходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 14:14 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Да и еще System.out.println(we.toString()); выдает Welcome@c1b531 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 14:20 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold FishПлз подскажите вчем причина. Убери свой класс из classpath. Если классы загруженны разными classLoader они разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 15:24 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Непомогло :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 17:35 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Выполни это разные классы System.out.println(sql.loadClass("Welcome")); System.out.println(Class.forName("Welcome")); Если ты убрал Welcome из classPath то тогда у тебя на вот этой строке должен кидаться ClassNotFoundException wel = (Welcome)we; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 19:26 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Вначале когда я удалил этот клас. Он мне всеравно кидал ClassCastException, а после перезагрузки начал кидать ClassNotFoundException. Я что-то не могу понять как его всетаки заставить работать???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 21:42 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold FishЯ что-то не могу понять как его всетаки заставить работать???? Именно для твоего примера надо чтобы классы Main и Welcome грузились одним classLoader'ом Достич этого можно несколькими способами -- заменить истемный класслоадер на свой параметр запуска явы -Djava.system.class.loader=MyClassLoader -- грузить Main через sqlClassLoader Вообще посмотри готовый код где это работает например в томже Tomcat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 10:40 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Но в таких решениях есть несколько проблем: 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 12:07 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Суть этого в том, что есть клиентская часть которая загружается локально и из нее происходит подключение к нужному серверу БД, а остальные объекты тянутся непосредственно с сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 14:29 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 17:14 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Я конечно наверное достал. Но что ты имеешь ввиду под Ты должен отталкиватся от URLClassLoader????? Можно немного поподробнее, я уже просто запутался. Начнем с самого начала: Есть клиент который запускается локально, из которого пользователь конектится к БД(под савоим логином и паролем) и только потом начинает тянуть нужные объекты именно оттуда. Соостветственно отсюда выплывает 2 проблеммы: 1. Объекты клиента должны подгрузится локально. т.к. еще нет соединения с БД 2. загрузчику объектов нужно передать дескриптор соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 18:15 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
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. Твоя основная проблемма в том что ты не доконца представляеш как работает ClassLoader :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 10:50 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
ты имеешь ввиду java.net.URLClassLoader????? у него нет метода LoadClassData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 12:41 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold Fishты имеешь ввиду java.net.URLClassLoader????? у него нет метода LoadClassData да. тебе надо переопределить protected Class findClass(String name) throws ClassNotFoundException. чтобы он искал сначала в SQL базе потом в super.find ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 13:40 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
дык он и так ищет if (data == null) { c = getParent().loadClass( name ); cache.put(name, c); return c; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 13:50 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold Fishдык он и так ищет Ага понял. Ты его переопредели от URLClassLoader, сделай конструктор по умолчанию(у тебя на его отсуствие ошибка была java.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader) Сделай static Connection conn; И попробуй с тем чтобы он был системным classLoader'om ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 14:51 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Переопредделил от URLClassLoader и создал конструктор по умолчанию. И всеравно дает ava.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 15:39 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold FishПереопредделил от URLClassLoader и создал конструктор по умолчанию. И всеравно дает ava.lang.NoSuchMethodException: sqlClassLoader.<init>(java.lang.ClassLoader) Хм он вот это хочет :-( sqlClassLoader (ClassLoader parent) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 16:28 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
И че делать??? Я пробовал наследовать от ClassLoader и SecureClassLoader тоже дает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 16:48 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold FishИ че делать??? Я пробовал наследовать от ClassLoader и SecureClassLoader тоже дает. Он конструктор хочет sqlClassLoader (ClassLoader parent) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 17:27 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Ну смертвой точки уже удалось сойти. Теперь новые проблемы. Если я наследую от УРЛКлассЛоадер и в конструкторе инициализирую как super(null, parent); вылазит NullPointerException при инициализации ВМ, а если я наследую от КлассЛоадер или СекьюриКлассЛоадер то при запуске ругается на рекурсивный вызов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2005, 17:54 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
up ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 11:49 |
|
||
|
ClassLoader и ClassCastException
|
|||
|---|---|---|---|
|
#18+
Gold FishНу смертвой точки уже удалось сойти. Теперь новые проблемы. Если я наследую от УРЛКлассЛоадер и в конструкторе инициализирую как super(null, parent); вылазит NullPointerException при инициализации ВМ, а если я наследую от КлассЛоадер или СекьюриКлассЛоадер то при запуске ругается на рекурсивный вызов А ты попробуй наследоваться от УРЛКлассЛоадер и переопределить только его конструкторы, т.е. вызывать не super(null, parent) а super(url, parent) Все таки советую поискать в сети как минимам есть классы JDBCClassLoader ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 15:21 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33390722&tid=2150781]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 355ms |

| 0 / 0 |
