質問編集履歴

3 質問と質問の内容が違ったので変更

katliner

katliner score 9

2018/02/04 23:25  投稿

Java アノテーションがついたクラスのアノテーションの値の取得方法
例えば@Modというアノテーションがあったとします。
Mod
```Java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Mod {
   String name() default "";
}
```
nameという値がセットできるようにするとします。
そしてあるクラスに
```Java
@Mod(name="test")
public class Test{
}
```
というふうに書かれています。
これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
メインのクラスが
```Java
public static void main(String[] args) {
   ClassLoader loader = new JarFileClassLoader(new File("test.zip"), ClassLoader.getSystemClassLoader());
   Class clas = Class.forName("Test",false,loader);
   for(Annotation anno : clas.getAnnotations()) {
       if (anno.annotationType().equals(Mod.class)) {
           Mod b = (Mod) anno;
           System.out.println("Value: " + b.name());
       }
   }
}
```
となっておりJarFileClassLoaderというのがこれです
```java
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/**
* JARファイルからクラスを読み込むクラスローダー
* @author NAT
*/
public class JarFileClassLoader extends URLClassLoader {
   /**
    * コンストラクタ
    * @param jarFiles クラスを読み込むJARファイルの配列
    * @param parent 親となるクラスローダー
    * @throws MalformedURLException パスを URL として構文解析できない場合
    */
   public JarFileClassLoader(File[] jarFiles, ClassLoader parent) throws MalformedURLException {
       super(toURLs(jarFiles), parent);
   }
   /**
    * コンストラクタ
    * @param jarFile クラスを読み込むJARファイル
    * @param parent 親となるクラスローダー
    * @throws MalformedURLException パスを URL として構文解析できない場合
    */
   public JarFileClassLoader(File jarFile, ClassLoader parent) throws MalformedURLException {
       this(new File[]{jarFile}, parent);
   }
   private static URL[] toURLs(File[] jarFiles) throws MalformedURLException {
       URL[] urls = new URL[jarFiles.length];
       for (int i = 0; i < jarFiles.length; i++) {
           urls[i] = jarFiles[i].toURL();
       }
       return urls;
   }
}
```
この場合、どうやったらnameが取得できますか?
するとメインのクラスの
```
if (anno.annotationType().equals(Mod.class))
```
がうまく動作しません。
おそらく別のクラスと認識されているのかと思います。
どうしたらうまく動作しますか?
  • Java

    17052 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2 ソースコードの追加

katliner

katliner score 9

2018/02/04 23:12  投稿

Java アノテーションがついたクラスのアノテーションの値の取得方法
例えば@Modというアノテーションがあったとします。
Mod  
```Java  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
 
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.TYPE)  
public @interface Mod {  
   String name() default "";  
}  
```  
nameという値がセットできるようにするとします。
そしてあるクラスに
```Java
@Mod(name="test")
public class Test{
}
```
というふうに書かれています。
これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
メインのクラスが  
```Java  
public static void main(String[] args) {  
   ClassLoader loader = new JarFileClassLoader(new File("test.zip"), ClassLoader.getSystemClassLoader());  
   Class clas = Class.forName("Test",false,loader);  
   for(Annotation anno : clas.getAnnotations()) {  
       if (anno.annotationType().equals(Mod.class)) {  
           Mod b = (Mod) anno;  
           System.out.println("Value: " + b.name());  
       }  
   }  
}  
```  
となっておりJarFileClassLoaderというのがこれです  
```java  
import java.io.File;  
import java.net.MalformedURLException;  
import java.net.URL;  
import java.net.URLClassLoader;  
 
/**  
* JARファイルからクラスを読み込むクラスローダー  
* @author NAT  
*/  
public class JarFileClassLoader extends URLClassLoader {  
   /**  
    * コンストラクタ  
    * @param jarFiles クラスを読み込むJARファイルの配列  
    * @param parent 親となるクラスローダー  
    * @throws MalformedURLException パスを URL として構文解析できない場合  
    */  
   public JarFileClassLoader(File[] jarFiles, ClassLoader parent) throws MalformedURLException {  
       super(toURLs(jarFiles), parent);  
   }  
 
   /**  
    * コンストラクタ  
    * @param jarFile クラスを読み込むJARファイル  
    * @param parent 親となるクラスローダー  
    * @throws MalformedURLException パスを URL として構文解析できない場合  
    */  
   public JarFileClassLoader(File jarFile, ClassLoader parent) throws MalformedURLException {  
       this(new File[]{jarFile}, parent);  
   }  
 
   private static URL[] toURLs(File[] jarFiles) throws MalformedURLException {  
       URL[] urls = new URL[jarFiles.length];  
       for (int i = 0; i < jarFiles.length; i++) {  
           urls[i] = jarFiles[i].toURL();  
       }  
       return urls;  
   }  
}  
```  
この場合、どうやったらnameが取得できますか?
  • Java

    17052 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1 情報の追記

katliner

katliner score 9

2018/02/04 22:58  投稿

Java アノテーションがついたクラスのアノテーションの値の取得方法
例えば@Modというアノテーションがあったとします。
nameという値がセットできるようにするとします。
そしてあるクラスに
```Java
@Mod(name="test")
public class Test{
}
```
というふうに書かれています。
これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。  
zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。  
この場合、どうやったらnameが取得できますか?
  • Java

    17052 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る