例えば@Modというアノテーションがあったとします。
Mod
Java
1import java.lang.annotation.ElementType; 2import java.lang.annotation.Retention; 3import java.lang.annotation.RetentionPolicy; 4import java.lang.annotation.Target; 5 6@Retention(RetentionPolicy.RUNTIME) 7@Target(ElementType.TYPE) 8public @interface Mod { 9 String name() default ""; 10}
nameという値がセットできるようにするとします。
そしてあるクラスに
Java
1@Mod(name="test") 2public class Test{ 3 4}
というふうに書かれています。
これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
メインのクラスが
Java
1public static void main(String[] args) { 2 ClassLoader loader = new JarFileClassLoader(new File("test.zip"), ClassLoader.getSystemClassLoader()); 3 Class clas = Class.forName("Test",false,loader); 4 for(Annotation anno : clas.getAnnotations()) { 5 if (anno.annotationType().equals(Mod.class)) { 6 Mod b = (Mod) anno; 7 System.out.println("Value: " + b.name()); 8 } 9 } 10}
となっておりJarFileClassLoaderというのがこれです
java
1import java.io.File; 2import java.net.MalformedURLException; 3import java.net.URL; 4import java.net.URLClassLoader; 5 6/** 7 * JARファイルからクラスを読み込むクラスローダー 8 * @author NAT 9 */ 10public class JarFileClassLoader extends URLClassLoader { 11 /** 12 * コンストラクタ 13 * @param jarFiles クラスを読み込むJARファイルの配列 14 * @param parent 親となるクラスローダー 15 * @throws MalformedURLException パスを URL として構文解析できない場合 16 */ 17 public JarFileClassLoader(File[] jarFiles, ClassLoader parent) throws MalformedURLException { 18 super(toURLs(jarFiles), parent); 19 } 20 21 /** 22 * コンストラクタ 23 * @param jarFile クラスを読み込むJARファイル 24 * @param parent 親となるクラスローダー 25 * @throws MalformedURLException パスを URL として構文解析できない場合 26 */ 27 public JarFileClassLoader(File jarFile, ClassLoader parent) throws MalformedURLException { 28 this(new File[]{jarFile}, parent); 29 } 30 31 private static URL[] toURLs(File[] jarFiles) throws MalformedURLException { 32 URL[] urls = new URL[jarFiles.length]; 33 for (int i = 0; i < jarFiles.length; i++) { 34 urls[i] = jarFiles[i].toURL(); 35 } 36 return urls; 37 } 38}
するとメインのクラスの
if (anno.annotationType().equals(Mod.class))
がうまく動作しません。
おそらく別のクラスと認識されているのかと思います。
どうしたらうまく動作しますか?
回答3件
あなたの回答
tips
プレビュー