回答編集履歴

1

リファイン

2015/07/01 06:37

投稿

argius
argius

スコア9390

test CHANGED
@@ -1,8 +1,12 @@
1
- 実行時に存在するかどうかわからないクラスやメソッドを実行するには、 **リフレクション**を使用します。
1
+ 実行時に存在するかどうかわからないクラスやメソッドを実行するには、 **リフレクション** を使用します。
2
2
 
3
3
  正確には、ソースがあるかどうかではなく、クラスがクラスパスに設定されているかどうか、です。
4
4
 
5
5
 
6
+
7
+
8
+
9
+ ※以下のソースではどんな例外がスローされるかが分かるように個別に`catch`ブロックを設けていますが、必要が無ければ分けなくてもOKです。
6
10
 
7
11
 
8
12
 
@@ -44,7 +48,7 @@
44
48
 
45
49
  o = c.newInstance();
46
50
 
47
- } catch (InstantiationException|IllegalAccessException e) {
51
+ } catch (InstantiationException | IllegalAccessException e) {
48
52
 
49
53
  e.printStackTrace();
50
54
 
@@ -58,7 +62,7 @@
58
62
 
59
63
  m = c.getDeclaredMethod("hage", int.class);
60
64
 
61
- } catch (NoSuchMethodException |SecurityException e) {
65
+ } catch (NoSuchMethodException | SecurityException e) {
62
66
 
63
67
  e.printStackTrace();
64
68
 
@@ -70,11 +74,9 @@
70
74
 
71
75
  m.invoke(o, 3); // => Huga.hage(), arg=3
72
76
 
73
- } catch (IllegalAccessException |IllegalArgumentException |InvocationTargetException e) {
77
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
74
78
 
75
79
  e.printStackTrace();
76
-
77
- return;
78
80
 
79
81
  }
80
82
 
@@ -130,7 +132,7 @@
130
132
 
131
133
 
132
134
 
133
- public interface IHuga {
135
+ public interface IHuga { // Hugaクラスは これを implements する
134
136
 
135
137
 
136
138
 
@@ -152,14 +154,18 @@
152
154
 
153
155
  try {
154
156
 
155
- o = (IHuga)Class.forName("local.Huga").newInstance(); // ここだけ例外をチェックすれば良い
157
+ o = (IHuga)Class.forName("local.Huga").newInstance();
156
158
 
157
- o.hage(3);
158
-
159
- } catch (InstantiationException |IllegalAccessException |ClassNotFoundException e) {
159
+ } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
160
160
 
161
161
  e.printStackTrace();
162
162
 
163
+ return;
164
+
163
165
  }
164
166
 
167
+ o.hage(3); // インターフェイスを介しての実行時にはリフレクションのエラーは発生しない
168
+
165
169
  ```
170
+
171
+