質問編集履歴

3

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

2018/02/04 14:25

投稿

katliner
katliner

スコア13

test CHANGED
File without changes
test CHANGED
@@ -156,4 +156,16 @@
156
156
 
157
157
  ```
158
158
 
159
+ するとメインのクラスの
160
+
161
+ ```
162
+
163
+ if (anno.annotationType().equals(Mod.class))
164
+
165
+ ```
166
+
167
+ がうまく動作しません。
168
+
169
+ おそらく別のクラスと認識されているのかと思います。
170
+
159
- この場合、どうやったらnameが取得できますか?
171
+ どうたらく動作しますか?

2

ソースコードの追加

2018/02/04 14:25

投稿

katliner
katliner

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,30 @@
1
1
  例えば@Modというアノテーションがあったとします。
2
+
3
+ Mod
4
+
5
+ ```Java
6
+
7
+ import java.lang.annotation.ElementType;
8
+
9
+ import java.lang.annotation.Retention;
10
+
11
+ import java.lang.annotation.RetentionPolicy;
12
+
13
+ import java.lang.annotation.Target;
14
+
15
+
16
+
17
+ @Retention(RetentionPolicy.RUNTIME)
18
+
19
+ @Target(ElementType.TYPE)
20
+
21
+ public @interface Mod {
22
+
23
+ String name() default "";
24
+
25
+ }
26
+
27
+ ```
2
28
 
3
29
  nameという値がセットできるようにするとします。
4
30
 
@@ -22,4 +48,112 @@
22
48
 
23
49
  zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
24
50
 
51
+ メインのクラスが
52
+
53
+ ```Java
54
+
55
+ public static void main(String[] args) {
56
+
57
+ ClassLoader loader = new JarFileClassLoader(new File("test.zip"), ClassLoader.getSystemClassLoader());
58
+
59
+ Class clas = Class.forName("Test",false,loader);
60
+
61
+ for(Annotation anno : clas.getAnnotations()) {
62
+
63
+ if (anno.annotationType().equals(Mod.class)) {
64
+
65
+ Mod b = (Mod) anno;
66
+
67
+ System.out.println("Value: " + b.name());
68
+
69
+ }
70
+
71
+ }
72
+
73
+ }
74
+
75
+ ```
76
+
77
+ となっておりJarFileClassLoaderというのがこれです
78
+
79
+ ```java
80
+
81
+ import java.io.File;
82
+
83
+ import java.net.MalformedURLException;
84
+
85
+ import java.net.URL;
86
+
87
+ import java.net.URLClassLoader;
88
+
89
+
90
+
91
+ /**
92
+
93
+ * JARファイルからクラスを読み込むクラスローダー
94
+
95
+ * @author NAT
96
+
97
+ */
98
+
99
+ public class JarFileClassLoader extends URLClassLoader {
100
+
101
+ /**
102
+
103
+ * コンストラクタ
104
+
105
+ * @param jarFiles クラスを読み込むJARファイルの配列
106
+
107
+ * @param parent 親となるクラスローダー
108
+
109
+ * @throws MalformedURLException パスを URL として構文解析できない場合
110
+
111
+ */
112
+
113
+ public JarFileClassLoader(File[] jarFiles, ClassLoader parent) throws MalformedURLException {
114
+
115
+ super(toURLs(jarFiles), parent);
116
+
117
+ }
118
+
119
+
120
+
121
+ /**
122
+
123
+ * コンストラクタ
124
+
125
+ * @param jarFile クラスを読み込むJARファイル
126
+
127
+ * @param parent 親となるクラスローダー
128
+
129
+ * @throws MalformedURLException パスを URL として構文解析できない場合
130
+
131
+ */
132
+
133
+ public JarFileClassLoader(File jarFile, ClassLoader parent) throws MalformedURLException {
134
+
135
+ this(new File[]{jarFile}, parent);
136
+
137
+ }
138
+
139
+
140
+
141
+ private static URL[] toURLs(File[] jarFiles) throws MalformedURLException {
142
+
143
+ URL[] urls = new URL[jarFiles.length];
144
+
145
+ for (int i = 0; i < jarFiles.length; i++) {
146
+
147
+ urls[i] = jarFiles[i].toURL();
148
+
149
+ }
150
+
151
+ return urls;
152
+
153
+ }
154
+
155
+ }
156
+
157
+ ```
158
+
25
159
  この場合、どうやったらnameが取得できますか?

1

情報の追記

2018/02/04 14:12

投稿

katliner
katliner

スコア13

test CHANGED
File without changes
test CHANGED
@@ -18,4 +18,8 @@
18
18
 
19
19
  というふうに書かれています。
20
20
 
21
+ これがzipファイルにされており、zipファイルをClassLoaderにしてClass.forNameでクラスを取得しています。
22
+
23
+ zipファイルの物はライブラリとして@Modを使っていて、そのライブラリは同包していません。
24
+
21
25
  この場合、どうやったらnameが取得できますか?