• ベストアンサー

jarファイル内のクラスをインスタンス化する

http://homepage3.nifty.com/satoshis/java/memo.html#extension 上記のサイトを参考に、jarファイル内のクラスをインスタンス化しようとしているのですが、 clazz.newInstance(); を実行しようとすると、以下のようなエラーが発生します。 java.lang.IllegalAccessException: Class jp.co.AAAAA.BBBBB can not access a member of class CCCCC with modifiers "" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.Class.newInstance0(Class.java:302) at java.lang.Class.newInstance(Class.java:261) at jp.co.loft.LogCut.main(LogCut.java:58) ※jp.co.AAAAA.BBBBB は実行クラス、CCCCCはjarファイル内のクラスです。 開発環境は、以下です。 eclipse2.1.1 + jdk1.5.0_02 どんな些細なことでもよいので、ご存知の方、ご教授願えないでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

インスタンス化しようとしているクラスに引数無しのコンストラクタが定義されていないとかないですか? またはjarファイルにアクセスできなかったり、クラスへのアクセス制限(protectedなど)がかかってるとか・・・

sn10016
質問者

補足

書き込み誠にありがとうございます。 引数なしのコンストラクタは定義されています。 また、クラスはpublicです。ちなみにメソッドもpublicです(メンバ変数はありませんです)。 「jarファイルにアクセスできない」というのはどういうことでしょうか?

その他の回答 (4)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.5

 #4です。  補則を最後までよく読んでなかったようです。  もう、解決してたんですね。  余分でした。  申し訳ありません。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんにちは。 >public class CCCCC { >CCCCC(){} >public void cc(){} >}  コンストラクタの修飾子が無指定ですよね。  BBBBBクラスは、jp.co.AAAAAパッケージなので、ここからはインスタンス化はできません。  プラグインにするのならpublic にしないといけないんじゃないでしょうか? public class CCCCC {   public CCCCC(){}   public void cc(){} }

sn10016
質問者

補足

PecoPlusさん、回等ありがとうございます。 そうなんですよね。 mmitsuさんへの補足にも書いたのですが、ろくにソースを見ないで、「コンストラクタがpublicだ」って書いてしまったために、皆さんを混乱させてしまったみたいです。すみません。

  • mmitsu
  • ベストアンサー率40% (2/5)
回答No.3

あと、書き忘れましたがなぜJarファイルがあるのに、reflectが必要なケースってどんな時ですか?普通にclasspathに含めてimportじゃダメなんでしょうか? 想像力がなくてすみません(^^;

sn10016
質問者

補足

A.jarに、B.jarの機能を追加したい。 そのときにわざわざA.jarのソースを修正してコンパイルしてjarを作り直して、ということをやりたくないという理由です。 ようはpluginの機能を実現したい、というのが理由です。 何はともあれ、書込みをしてくれたお二人のおかげで解決いたしました。誠にありがとうございました。

  • mmitsu
  • ベストアンサー率40% (2/5)
回答No.2

CCCCCクラスの宣言はどうなってますか? どうしてもわからなければ、java.lang.Stringクラスなどで試してみてはどうでしょう。

sn10016
質問者

補足

mmitsuさん、回答ありがとうございます。 クラスの宣言は以下のようになっています。 public class CCCCC { CCCCC(){} public void cc(){} } と、ここまで書いて気づいたのですが、コンストラクタがpublicになっていません!!! 昨日Bonjinさんの回答に補足したときは、ソースを見ることができなかったので、憶測で書いてしまいました。 publicにしたら、期待通りの動作をしてくれました。 この場を借りて、Bonjinさん、mmitsuさん、すみませんでした。

関連するQ&A