質問するログイン新規登録

質問編集履歴

3

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

2018/02/04 14:25

投稿

katliner
katliner

スコア13

title CHANGED
File without changes
body CHANGED
@@ -77,4 +77,10 @@
77
77
  }
78
78
  }
79
79
  ```
80
+ するとメインのクラスの
81
+ ```
82
+ if (anno.annotationType().equals(Mod.class))
83
+ ```
84
+ がうまく動作しません。
85
+ おそらく別のクラスと認識されているのかと思います。
80
- この場合、どうやったらnameが取得できますか?
86
+ どうたらく動作しますか?

2

ソースコードの追加

2018/02/04 14:25

投稿

katliner
katliner

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,17 @@
1
1
  例えば@Modというアノテーションがあったとします。
2
+ Mod
3
+ ```Java
4
+ import java.lang.annotation.ElementType;
5
+ import java.lang.annotation.Retention;
6
+ import java.lang.annotation.RetentionPolicy;
7
+ import java.lang.annotation.Target;
8
+
9
+ @Retention(RetentionPolicy.RUNTIME)
10
+ @Target(ElementType.TYPE)
11
+ public @interface Mod {
12
+ String name() default "";
13
+ }
14
+ ```
2
15
  nameという値がセットできるようにするとします。
3
16
  そしてあるクラスに
4
17
  ```Java
@@ -10,4 +23,58 @@
10
23
  というふうに書かれています。
11
24
  これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
12
25
  zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
26
+ メインのクラスが
27
+ ```Java
28
+ public static void main(String[] args) {
29
+ ClassLoader loader = new JarFileClassLoader(new File("test.zip"), ClassLoader.getSystemClassLoader());
30
+ Class clas = Class.forName("Test",false,loader);
31
+ for(Annotation anno : clas.getAnnotations()) {
32
+ if (anno.annotationType().equals(Mod.class)) {
33
+ Mod b = (Mod) anno;
34
+ System.out.println("Value: " + b.name());
35
+ }
36
+ }
37
+ }
38
+ ```
39
+ となっておりJarFileClassLoaderというのがこれです
40
+ ```java
41
+ import java.io.File;
42
+ import java.net.MalformedURLException;
43
+ import java.net.URL;
44
+ import java.net.URLClassLoader;
45
+
46
+ /**
47
+ * JARファイルからクラスを読み込むクラスローダー
48
+ * @author NAT
49
+ */
50
+ public class JarFileClassLoader extends URLClassLoader {
51
+ /**
52
+ * コンストラクタ
53
+ * @param jarFiles クラスを読み込むJARファイルの配列
54
+ * @param parent 親となるクラスローダー
55
+ * @throws MalformedURLException パスを URL として構文解析できない場合
56
+ */
57
+ public JarFileClassLoader(File[] jarFiles, ClassLoader parent) throws MalformedURLException {
58
+ super(toURLs(jarFiles), parent);
59
+ }
60
+
61
+ /**
62
+ * コンストラクタ
63
+ * @param jarFile クラスを読み込むJARファイル
64
+ * @param parent 親となるクラスローダー
65
+ * @throws MalformedURLException パスを URL として構文解析できない場合
66
+ */
67
+ public JarFileClassLoader(File jarFile, ClassLoader parent) throws MalformedURLException {
68
+ this(new File[]{jarFile}, parent);
69
+ }
70
+
71
+ private static URL[] toURLs(File[] jarFiles) throws MalformedURLException {
72
+ URL[] urls = new URL[jarFiles.length];
73
+ for (int i = 0; i < jarFiles.length; i++) {
74
+ urls[i] = jarFiles[i].toURL();
75
+ }
76
+ return urls;
77
+ }
78
+ }
79
+ ```
13
80
  この場合、どうやったらnameが取得できますか?

1

情報の追記

2018/02/04 14:12

投稿

katliner
katliner

スコア13

title CHANGED
File without changes
body CHANGED
@@ -8,4 +8,6 @@
8
8
  }
9
9
  ```
10
10
  というふうに書かれています。
11
+ これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
12
+ zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
11
13
  この場合、どうやったらnameが取得できますか?