Hogeというプロジェクトがあり、Hoge.javaから起動できるとします。
このプロジェクトにHuga.javaというソースファイルを追加し、Huga内のHageというメソッドをHogeから実行したいのです。
ただしこのHugaというソースファイルはある場合とない場合があり、名前がHugaだとは限らないとします。
HugaのHageの呼び出しをソースのあるなしで決めるにはどうしたら良いのでしょうか。同じようなことをやっているJavaのプログラムがあるので、可能だとは思うのですが……
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
実行時に存在するかどうかわからないクラスやメソッドを実行するには、 リフレクション を使用します。
正確には、ソースがあるかどうかではなく、クラスがクラスパスに設定されているかどうか、です。
※以下のソースではどんな例外がスローされるかが分かるように個別にcatch
ブロックを設けていますが、必要が無ければ分けなくてもOKです。
- Hoge.java
lang
1package local; 2import java.lang.reflect.InvocationTargetException; 3import java.lang.reflect.Method; 4 5public class Hoge { 6 7 public static void main(String[] args) { 8 Class<?> c; 9 try { 10 c = Class.forName("local.Huga"); 11 } catch (ClassNotFoundException e) { 12 e.printStackTrace(); 13 return; 14 } 15 Object o; 16 try { 17 o = c.newInstance(); 18 } catch (InstantiationException | IllegalAccessException e) { 19 e.printStackTrace(); 20 return; 21 } 22 Method m; 23 try { 24 m = c.getDeclaredMethod("hage", int.class); 25 } catch (NoSuchMethodException | SecurityException e) { 26 e.printStackTrace(); 27 return; 28 } 29 try { 30 m.invoke(o, 3); // => Huga.hage(), arg=3 31 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 32 e.printStackTrace(); 33 } 34 } 35 36}
- Huga.java
lang
1package local; 2 3public class Huga { 4 5 public void hage(int arg) { 6 System.out.println("Huga.hage(), arg=" + arg); 7 } 8 9}
リフレクションを使う場合は、直接操作するよりも、インターフェイスを介して行う方が推奨されています。
lang
1package local; 2 3public interface IHuga { // Hugaクラスは これを implements する 4 5 public void hage(int i); 6 7}
lang
1IHuga o; 2try { 3 o = (IHuga)Class.forName("local.Huga").newInstance(); 4} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 5 e.printStackTrace(); 6 return; 7} 8o.hage(3); // インターフェイスを介しての実行時にはリフレクションのエラーは発生しない
投稿2015/07/01 04:18
編集2015/07/01 06:37総合スコア9390
0
やりたいことはまさにAOPではないでしょうか。
アスペクト指向プログラミング(AOP:Aspect Oriented Programming)とは
投稿2015/07/01 04:14
総合スコア3541
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/01 04:33