Субъект действительно говорит о моей цели, но я поставлен в тупик относительно реализации.У меня есть программа, которая принимает различные объекты, которые расширяют мой класс Randomizer
.Я хочу сделать так, чтобы можно было поместить файл JAR
в путь к классам, и программа запустит его при запуске и добавит в основную программу.Это то, что я пытался до сих пор, но я остановился, когда понял, что java.util.jar.JarFile
не может дать вам Class
es или Method
s.
, так как он полагается на это, я мог бы какхорошо упомянуть, что мой класс ArrayPP<T>
похож на ArrayList
, но с большим количеством методов.Его метод addAll
, показанный здесь, функционирует подобно методу add
, но с несколькими аргументами или массивом объектов универсального типа T
.
private static Randomizer[] loadExternalRandomizers() throws IOException
{
java.io.File classPath = new java.io.File(System.getProperty("user.dir"));
ArrayPP<Randomizer> r = new ArrayPP<>();
if (classPath.isDirectory())
{
r.addAll(getRandomizersIn(classPath));
}
return r.toArray();
}
private static Randomizer[] getRandomizersIn(File dir) throws IOException
{
ArrayPP<Randomizer> r = new ArrayPP<>();
java.io.File fs[] = dir.listFiles(new java.io.FileFilter() {
@Override
public boolean accept(File pathname)
{
return pathname.isDirectory() || pathname.toString().endsWith(".jar");
}
});
java.util.jar.JarFile jr;
java.util.Enumeration<java.util.jar.JarEntry> entries;
java.util.jar.JarEntry thisEntry;
for (java.io.File f : fs)
{
if (f.isDirectory())
{
r.addAll(getRandomizersIn(f));
continue;
}
jr = new java.util.jar.JarFile(f);
entries = jr.entries();
while (entries.hasMoreElements())
{
thisEntry = entries.nextElement();
//if (the jar file contains a class that extends Randomizer
// add that class to r
}
}
return r.toArray();
}
Я строю его на Java 7, если это поможет.Я также пытаюсь сделать это без использования каких-либо библиотек.
Реализация решения
Я попытался реализовать решение, описанное Райаном Стюартом, и оно показано ниже.Я работаю с тестом JAR
с именем BHR2 - Ranger.jar
, который содержит один класс, который расширяет Randomizer
, который называется Ranger
, в пакете bhr2.plugins
.JAR
содержит в своей папке META-INF\services
один файл с именем bhr2.plugins.Ranger
с одной строкой в нем, которая гласит bhr2.Randomizer # Abstract Randomizer
.
private static ArrayPP<Randomizer> loadExternalRandomizers() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
{
java.io.File classPath = new java.io.File(System.getProperty("user.dir"));
ArrayPP<Randomizer> r = new ArrayPP<>();
if (classPath.isDirectory())
{
r.addAll(getRandomizersIn(classPath));
}
return r;
}
private static int depth = 0;
private static ArrayPP<Randomizer> getRandomizersIn(File dir) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
{
ArrayPP<Randomizer> r = new ArrayPP<>();
java.io.File fs[] = dir.listFiles(new java.io.FileFilter() {
@Override
public boolean accept(File pathname)
{
return pathname.isDirectory() || pathname.toString().endsWith(".jar");
}
});
for (java.io.File f : fs)
{
for (int i=0; i < depth; i++)
System.out.print(" ");
System.out.println(f);
if (f.isDirectory())
{
if (depth < 4)
{
depth++;
r.addAll(getRandomizersIn(f));
depth--;
}
else
System.out.println("Skipping directory due to depth");
continue;
}
java.util.ServiceLoader<Randomizer> sl = ServiceLoader.loadInstalled(Randomizer.class);
for (Randomizer rand : sl)
{
r.add(rand);
System.out.println("adding " + rand);
}
}
return r == null || r.isEmpty() ? new ArrayPP<Randomizer>() : r;
}
Но когда я запускаю его, это все, что я получаюкак вывод, прежде чем он начнет делать другие вещи:
I:\Java\NetBeansProjects\BHRandomizer2\nbproject
I:\Java\NetBeansProjects\BHRandomizer2\nbproject\private
I:\Java\NetBeansProjects\BHRandomizer2\src
I:\Java\NetBeansProjects\BHRandomizer2\src\bhr2
I:\Java\NetBeansProjects\BHRandomizer2\src\bhr2\resources
I:\Java\NetBeansProjects\BHRandomizer2\src\bhr2\randomizers
I:\Java\NetBeansProjects\BHRandomizer2\src\bht
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\test
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools\comps
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools\comps\gameboard
Skipping directory due to depth
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools\effects
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools\misc
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\tools\utilities
I:\Java\NetBeansProjects\BHRandomizer2\src\bht\resources
I:\Java\NetBeansProjects\BHRandomizer2\lib
I:\Java\NetBeansProjects\BHRandomizer2\lib\CopyLibs
I:\Java\NetBeansProjects\BHRandomizer2\lib\CopyLibs\org-netbeans-modules-java-j2seproject-copylibstask.jar
I:\Java\NetBeansProjects\BHRandomizer2\lib\swing-layout
I:\Java\NetBeansProjects\BHRandomizer2\lib\swing-layout\swing-layout-1.0.4.jar
I:\Java\NetBeansProjects\BHRandomizer2\BHR2 - Ranger
I:\Java\NetBeansProjects\BHRandomizer2\BHR2 - Ranger\META-INF
I:\Java\NetBeansProjects\BHRandomizer2\BHR2 - Ranger\bhr2
I:\Java\NetBeansProjects\BHRandomizer2\BHR2 - Ranger\bhr2\plugins
I:\Java\NetBeansProjects\BHRandomizer2\build
I:\Java\NetBeansProjects\BHRandomizer2\build\classes
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bhr2
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bhr2\randomizers
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bhr2\resources
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\tools
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\tools\comps
Skipping directory due to depth
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\tools\utilities
Skipping directory due to depth
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\tools\effects
Skipping directory due to depth
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\tools\misc
Skipping directory due to depth
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\resources
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\bht\test
I:\Java\NetBeansProjects\BHRandomizer2\build\classes\META-INF
I:\Java\NetBeansProjects\BHRandomizer2\build\empty
I:\Java\NetBeansProjects\BHRandomizer2\build\generated-sources
I:\Java\NetBeansProjects\BHRandomizer2\build\generated-sources\ap-source-output
I:\Java\NetBeansProjects\BHRandomizer2\dist
I:\Java\NetBeansProjects\BHRandomizer2\dist\BHRandomizer2.jar
I:\Java\NetBeansProjects\BHRandomizer2\BHR2 - Ranger.jar