Rod
リフレクションを使用して、jar ファイルからカスタム オブジェクト ( ) をロードしようとしています。jarファイルを見つけてクラスをスキャンして必要な注釈を取得することができましたが、呼び出すたびに、ロードしようとしているクラスが拡張されているクラスをclassLoader.loadClass()
取得します。ClassNotFoundException
これは ClassLoader のコードです。
public static Set<Rod> getRods(File rodDirectory) throws Exception {
rodDirectory.mkdir();
URLClassLoader classLoader;
Set<Rod> rods = new HashSet<Rod>();
for (File f : rodDirectory.listFiles()) {
if (f.isDirectory() || !f.getName().endsWith(".jar"))
continue;
JarFile jar = new JarFile(f);
Enumeration<JarEntry> e = jar.entries();
classLoader = URLClassLoader.newInstance(new URL[]{new URL("jar:file:" + f.getAbsolutePath() + "!/")});
while (e.hasMoreElements()) {
JarEntry j = (JarEntry) e.nextElement();
if(j.isDirectory() || !j.getName().endsWith(".class")){
continue;
}
Class<?> c = classLoader.loadClass(j.getName().substring(0, j.getName().length() - 6));
CustomRod a = c.getAnnotation(CustomRod.class);
if (a == null)
continue;
if (a.minimumVersion() < RodsTwo.getVersion())
continue;
rods.add((Rod) c.getConstructor().newInstance());
}
jar.close();
}
return rods;
}
これは、ロードしようとしている jar 内のコードです。
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import ca.kanoa.RodsTwo.Objects.ConfigOptions;
import ca.kanoa.RodsTwo.Objects.CustomRod;
import ca.kanoa.RodsTwo.Objects.Rod;
@CustomRod(minimumVersion=1.001)
public class Test extends Rod {
public Test() throws Exception {
super("Test", 1, 46, new ConfigOptions(), 200);
}
@Override
public boolean run(Player arg0, ConfigurationSection arg1) {
arg0.sendMessage("HI!");
return true;
}
}
そして、私の他のすべてのコードはhere で見つけることができます。
リフレクションをいじり始めたところです。