Ik ben bezig met een soort van plugin systeem in Java. Daarvoor wil ik alle classes uit een bepaalde package of directory dynamisch aan kunnen maken, maar ik weet niet welke classes er in die package of directory staan. Ik heb eerst gekeken of ik alle classes uit een package op kon vragen met reflection, maar om een of andere rede krijg ik dat niet voor elkaar. In de documentatie van de klasse java.lang.Package staat nergens een methode om de klassen uit die package op te vragen.
Daarna heb ik geprobeerd om alle .class bestanden uit een directory te laden, en de naam van die klassen als String terug te geven. Dit lukt aardig, behalve in één geval.
Stel, je hebt klasse a en b. Klasse a extends b, en ze staan beide in de directory die geladen moet worden. Deze directory staat ook in het classpath.
Ik vraag de lijst van alle bestanden op, en krijg de volgende array terug:
File[] files = {a.class, b.class};
(nou ja, ik hoop dat jullie snappen wat ik bedoel)
Ik doorloop het array, en laad eerst klasse a in. Als ik daarna klasse b in wil laden, krijg ik de volgende foutmelding:
java.lang.LinkageError: duplicate class definition: b
De code die het laden van de bestanden regelt:
Ik kan die foutmelding wel afvangen, en doorgaan met de volgende, maar dan mis ik dus die klasse in de lijst.
Een kant en klare oplossing is niet nodig (mag wel overigens
), maar een hint om verder te komen is meer dan welkom.
Daarna heb ik geprobeerd om alle .class bestanden uit een directory te laden, en de naam van die klassen als String terug te geven. Dit lukt aardig, behalve in één geval.
Stel, je hebt klasse a en b. Klasse a extends b, en ze staan beide in de directory die geladen moet worden. Deze directory staat ook in het classpath.
Ik vraag de lijst van alle bestanden op, en krijg de volgende array terug:
File[] files = {a.class, b.class};
(nou ja, ik hoop dat jullie snappen wat ik bedoel)
Ik doorloop het array, en laad eerst klasse a in. Als ik daarna klasse b in wil laden, krijg ik de volgende foutmelding:
java.lang.LinkageError: duplicate class definition: b
De code die het laden van de bestanden regelt:
Java:
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
| public String[] getClasses(){ if (classes != null){ return classes; } File[] files = pluginDirectory.listFiles(); StringVector classVector = new StringVector(); for (int i = 0; i < files.length; i++){ File file = files[i]; String fileName = file.getAbsolutePath(); if (fileName.toLowerCase().endsWith(".class")){ byte[] bytes = new byte[(int)file.length()]; try { FileInputStream fis = new FileInputStream(file); fis.read(bytes); Class newClass = defineClass(null, bytes, 0, bytes.length); classVector.add(newClass.getName()); } catch (IOException ex) { } catch (ClassFormatError ex) { } } } classes = classVector.toStringArray(); return classes; } |
Ik kan die foutmelding wel afvangen, en doorgaan met de volgende, maar dan mis ik dus die klasse in de lijst.
Een kant en klare oplossing is niet nodig (mag wel overigens