• ベストアンサー

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 どんな些細なことでもよいので、ご存知の方、ご教授願えないでしょうか。 よろしくお願いいたします。

  • Java
  • 回答数5
  • ありがとう数0

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

  • ベストアンサー
  • 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

  • Appletが動きません・・・

    こんにちは。今日Javaを学び始めた超初心者です。 -HelloApplet.java-------------------------- import java.awt.Graphics; import java.applet.Applet; class HelloApplet extends Applet{ public void paint(Graphics g){ g.drawString("Hello World", 50,25); } } ------------------------------------------- で、これをコンパイルしてHTMLに組み込み、Appletviewerで見てみるのですが、 以下のようなメッセージが出ます。 ---------------------------------------------- C:\java>appletviewer hello.html load: HelloApplet.class は public ではありません。あるいは public なコンストラク タを持っていません。 java.lang.IllegalAccessException: Class sun.applet.AppletPanel can not access a member of class HelloApplet with modifiers "" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.Class.newInstance0(Class.java:302) at java.lang.Class.newInstance0(Class.java:302) at java.lang.Class.newInstance(Class.java:261) at sun.applet.AppletPanel.createApplet(AppletPanel.java:617) at sun.applet.AppletPanel.runLoader(AppletPanel.java:546) at sun.applet.AppletPanel.run(AppletPanel.java:298) at java.lang.Thread.run(Thread.java:534) ---------------------------------------------- HTMLを開くと赤い「×」が出ています。 環境ですが、 CLASSPATH:C:\j2sdk1.4.2_04\lib\tools.jar;.;c:\java PATH:C:\WINDOWS;C:\WINDOWS\COMMAND;C:\j2sdk1.4.2_04\bin 作業フォルダ: c:\java となっています。 おかしいところはないと思うのですけど・・・。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 作ったjarファイルが起動しません。

    Eclipseでエクスポートしたjarファイルが起動しません。 hello.jarというのを作ったのですが コマンドプロンプトを使って java -jar hello.jar ならば正常に起動します。 マニフェストファイルはちゃんとできているように思います。 他の(自分で作ったものでない)JARファイルは普通に動きます。 コードは package hello.konnnitiha; public class Hello { public static void main(String[] args){ System.out.println("Hello!"); } } マニフェストファイルは Manifest-Version: 1.0 Main-Class: hello.konnnitiha.Hello となっています。 ちなみにコマンドプロンプトで java hello.jar で起動しようとすると Exception in thread "main" java.lang.NoClassDefFoundError: hello/jar Caused by: java.lang.ClassNotFoundException: hello.jar at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: hello.jar. Program will exit. となります。

  • JARファイルの起動方法

    現在FORTEのツールを使ってJAVAの勉強をしているのですが、FORTEで作ったアプリをJARファイルにしてFORTE上での実行は問題なくできました。しかしFORTEを使わずにDOS上からコマンドでJARファイルを起動してもエラーが出ます。多分クラスパスの設定の問題ではないかと思うのですがどうもうまくいきません。誰か教えていただけないでしょうか?エラーは C:\>java -jar SerialPort.jar Exception in thread "main" java.lang.NoClassDefFoundError: javax/comm/SerialPort EventListener at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:502) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12

    • ベストアンサー
    • Java
  • Macで実行可能jarが実行できない

    EclipseでJavaの開発をしているのですが、Windowsで実行可能jarでエクスポートするとダブルクリックで実行できるソースコードが同じコードで、Macでエクスポートすると実行出来ません。 ダブルクリックすると、 Java JARファイル"hoge.jar"を起動できませんでした。 というメッセージが出ます。コンソールから java hoge.jar と実行すると、 Exception in thread "main" java.lang.NoClassDefFoundError: Hoge/jar Caused by: java.lang.ClassNotFoundException: hoge.jar at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) と出ます。 Macは使い始めで余計によくわかりません。よろしくお願いします。

    • ベストアンサー
    • Java
  • jar ファイルが起動しなくなった。

    以前は、jar ファイルをダブルクリックすると起動したのですが、 jar のいくつかのバージョンからダブルクリックしても起動しなくなりました。 OS は、Windows XP, Java は、jre 1.6.0_07 です。 jar 1.5.0_09 のときは、確かに起動した *.jar ファイルです。 同様の現象でお困りの方、又は、解決された方、書き込みお願いします。 ちなみにエラーは、 Exception in thread "main" java.lang.NoClassDefFoundError: C:\Documents and Settings\aaa\デスクトップ\WireObject14/jar Caused by: java.lang.ClassNotFoundException: C:\Documents and Settings\aaa\デスクトップ\WireObject14.jar at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) です。

    • ベストアンサー
    • Java
  • 実行可能jarファイルについて!

    実行可能jarファイルについて! java -jar Foo.jar Foo というやり方で、実行可能jarファイルにあるクラスの中から実行するクラスを指定できるという記述があったので、試してみたのですが、うまくいきません。 http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/java_primer/ExecutableJarfile.html どうしても、マニフェストファイルに書かれたクラスが実行されてしまいます。 マニフェストファイルはこちらの内容になります。 Manifest-Version: 1.0 Rsrc-Class-Path: ./ geronimo-jta_1.1_spec-1.0.jar s2-dao-1.0.49.jar co mmons-logging-1.1.jar poi-3.0-FINAL.jar aopalliance-1.0.jar s2-dao-ti ger-1.0.49.jar junit-3.8.2.jar teeda-core-1.0.13-sp7.jar geronimo-ser vlet_2.4_spec-1.0.jar cglib-nodep-2.1_3.jar s2-extension-2.4.40.jar s 2-tiger-2.4.40.jar easymock-2.4.jar teeda-webunit-0.2.2.jar teeda-aja x-1.0.13-sp7.jar teeda-tiger-1.0.13-sp7.jar ojdbc6.jar easymockclasse xtension-2.4.jar commons-lang-2.4.jar javassist-3.4.ga.jar teeda-xmlu nit-0.1.0.jar log4j-1.2.13.jar teeda-extension-1.0.13-sp7.jar ognl-2. 6.9-patch-20090427.jar junit-4.4.jar junit-addons-1.4.jar s2-framewor k-2.4.40.jar h2-1.0.69.jar Class-Path: . Rsrc-Main-Class: jp.co.tsys.sfi.batch.execute.TagOutputExecute Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader jarファイルは、Eclipseの実行可能jarファイルの出力で、エクスポートしました。 よくみると、Main-ClassがEclipseのクラスになっているので、そこが違うのかな、と予想しています。 なぜ、Eclipseのエクスポートを使っているかというと、ライブラリのjarファイル群をjarファイルに取り込むのに便利だと思ったからです。 →これさえできれば、ほかの方法で構いません。 どうかよろしくお願いします!

    • ベストアンサー
    • Java
  • jarファイルのマニフェストについて

    JAVA初心者です。複数classをjarファイルにして実行する場合。マニフェストを登録すると、java -jarオプションで実行できると思いますが、それぞれのclassが別階層にあった場合メインクラスが見つからないとうエラーで実行できません。別階層にある場合はマニフェストは使えないのでしょうか。

    • ベストアンサー
    • Java
  • javaでscalaのクラスを使う

     Scala初心者です^^  Scalaで作ったクラスをJavaで使おうとしています.  しかしなかなかうまくいかなくて…  ソースを下に書いておきます. [ap/hello.scala] class hello(str2: String){ val str = str2 def say(){ println(str) } } [ap/start.java] public class start{ public static void main(String[] args){ hello h = new hello("Hello!"); h.say(); } }  helloクラスのコンストラクタを用いて指定した文字列を helloクラスのsayメソッドで標準出力するだけの簡単なクラスなのですが, うまく実行できず… Exception in thread "main" java.lang.NoClassDefFoundError: ap/start/class Caused by: java.lang.ClassNotFoundException: ap.start.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Kazus-MackBookPro:ScalaLearning macuser$ java ap/start Exception in thread "main" java.lang.NoClassDefFoundError: ap/start (wrong name: start) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) というエラーが出てしまいます.    どこが悪いかわかる方いらっしゃいませんか?  それとも,JavaではScalaで作った.classファイルは使うことができないのでしょうか?  Scalaはまだ覚えて2週間なので,まだ完全に理解できていません><    よろしくお願いします

  • jarファイル内のクラスからjarファイル名の取得

    こんにちわ!yukimura1024です。 ちょっとわかりにくいタイトルかもですが質問です(^^; ○前提条件 1.コマンドプロンプトで以下のようにjarファイルを実行します。  java -jar xxx.jar xxx1 xxx2 2.xxx.jarのなかはx.class、y.class、z.class、と3つのクラスがあり、   x.classのmainメソッドが最初に呼び出されます。 ○質問 上記条件のとき、x.classのmainメソッド内で「xxx.jar」という文字列を取得したいのですが こんなことは可能でしょうか? なぜこんなことをしたいのかというと以下の理由からです。 1.xxx.jarのほかにyyy.jarというjarファイルも作成し、x.class、y.class、z.classを格納する。 2.yyy.jarも最初にx.classのmainメソッドが呼び出される。 3.x.classのmainメソッド内でxxx.jar、yyy.jarのどちらとして呼び出されたのか知りたい! ※2つのjarファイルに格納するx.class、y.class、z.classはまったく同じものです。 アドバイスいただける方いましたらお願いします。

    • ベストアンサー
    • Java
  • JARファイル・JARコマンドに関して

    JARファイル・JARコマンドに関しての質問です。 同じクラスファイルを使用して、2つのJARファイルを作成しました。 しかし、バイナリツールでファイルを比較したところ、バイナリデータの一致が取れませんでした。 下記に、例と質問を記載します。 ご存知の方がおりましたら、ご教授よろしくお願いします。 例: 1.jar cf C:\java\test\HelloWorld1.jar C:\java\test\HelloWorld.class (クラスファイルをHelloWorld1.jarというJARファイルを作成します。) 2.jar cf C:\java\test\HelloWorld2.jar C:\java\test\HelloWorld.class (クラスファイルをHelloWorld2.jarというJARファイルを作成します。) ※HelloWorld.classはhelloと表示されるだけの簡単プログラムです。 1で作成されたJARファイルと、2で作成されたJARファイルをバイナリで比較したところ一致しませんでした。 ■質問 1.JARコマンドはJARファイルを作成する際に何をしているのでしょうか? 2.同じクラスファイルでJARファイルを作成しているのに、バイナリデータに差がでるのはなぜでしょうか? JARファイル作成時に作成時間等をファイルに保持しているのでしょうか? (作成時間が違うため、JARファイルで差がでるのでは、と推測しています・・・・) いろいろ調べてみたのですが、良い情報が見つかりませんでした。 参考URLだけでも結構です。 ご存知の方がいましたら、ご教授よろしくお願いします。m(_ _)m

    • ベストアンサー
    • Java

専門家に質問してみよう