2013-07-17 5 views
0

Когда будут рассмотрены два класса? Например, есть ли что-то, действующее как подпись класса? Если да, то что подсчитывает подпись, информация о пакете, имя класса и т. Д.? Я спрашиваю об этом, потому что мне нужно динамически загружать класс, и я всегда получал ClassNotFoundExceptionПодпись класса Java и динамическая загрузка

Немного подробнее: Я использую Eclipse. У меня abstract class Panel в моем package com.example.project.sub1. И class Test в package com.example.project.sub2, который будет вызывать

 
ClassLoader loader = new URLClassLoader(
     new URL[]{new URL("file://" + path)}); 
       /*the path is specified runtime and can be in a different 
        directory other than working directory. It's the path 
        to the parent directory of the class file I need to load. 
       */ 
Class&ltPanel> panelClass = (Class&ltPanel>)loader.loadClass(className); 
       //class name is runtime specified. 

Это компилируется нормально. Затем я скопировал весь материал в Panel.java в новый каталог и создал class MyPanel extends Panel вместе с Panel.java. Это тоже хорошо компилируется, но когда я укажу путь к моему новому MyPanel.class, я всегда получаю ClassNotFoundException. Любая идея, где я ошибаюсь? Благодарю.

EDIT: Трассировка стека:

 
java.lang.ClassNotFoundException: MyPanel 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at com.example.project.sub2 (Test.java:111) 
    at java.lang.Thread.run(Thread.java:680) 
+0

Скорее всего, файл находится в неправильном месте. Можете ли вы показать все пути? И все исключение? – Thilo

+0

@Thilo Я использовал JFileChooser для поиска файла, поэтому я предполагаю, что путь правильный? Я включаю трассировку стека за минуту, хотя на первый взгляд это не помогает. – YankeeWhiskey

+1

Это полезно ;-) Это показывает, что вы используете неправильное имя класса (пакет отсутствует). – Thilo

ответ

1

Если вы хотите для динамической загрузки класса com.example.project.sub1.Panel из URL-адреса файла, этот URL-адрес должен ссылаться на каталог, содержащий каталог com. Оттуда ClassLoader будет искать класс в пути подкаталога, соответствующего пути пакета. И имя класса для передачи - это полное имя: com.example.project.sub1.Panel.

Кроме того, класс кодирования MyPanel вернет Class<MyPanel>, а не Class<Panel>. Вы должны использовать Class<? extends Panel> как тип переменной.

Я не уверен, почему вы динамически загружаете классы. Фактическая проблема, которую вы пытаетесь решить, вероятно, разрешима по-другому.

+0

Я пишу расширяемое приложение, поэтому пользователи могут предоставить свой собственный подкласс «Панель» после того, как я отправлю приложение и подключу его собственную «Панель». Другой лучший способ добиться этого? – YankeeWhiskey

+1

Да: пусть они помещают свои собственные каталоги/банки в путь к классам и настраивают приложение с помощью некоторого файла конфигурации. Затем загрузите класс по имени, например, с помощью 'Class.forName()'. Беспорядок с несколькими загрузчиками классов - непростая задача.И если пользователи достаточно сообразительны, чтобы писать и компилировать Java-код, они должны быть достаточно сообразительны, чтобы настроить и запустить приложение. –

+0

Я пытаюсь понять, что вы говорите, так как я немного неопытен в этом. Итак, вы имеете в виду, если пользователь компилирует, скажем, 'ИхPanel.class' и помещает его в путь к классам, я могу найти его с помощью' Class.forName'? Также я предполагаю, что мне нужно предоставить исходный код моей абстрактной панели в качестве плана, тогда мне также нужно включить информацию о пакете? – YankeeWhiskey

2

java.lang.ClassNotFoundException: MyPanel

Класс не называется "MyPanel", это «com.example.project .sub1.MyPanel».

Это путь к родительскому каталогу файла класса, который мне нужно загрузить.

Да, это не сработает. Он должен быть каталогом в корне иерархии пакетов, поэтому не «/ some/path/classes/com/example/project/sub1 /», но «/ some/path/classes»

+0

Итак, если я не укажу информацию о пакете в каталоге 'GamePanel.java' и' MyPanel.java'in my ** new **, будет ли этот 'MyPanel.class' рассматриваться как подкласс' GamePanel.class 'в моем ** оригинальном пакете **? Благодарю. – YankeeWhiskey

Смежные вопросы