JAVAで「あるプログラムP実行中に、外部にあるJAVAのプログラムのコードQを読み込んでP内で実行する」方法があれば教えてください。もしくは、実行するクラス名を外部ファイルから参照することができるだけでも結構です。


ズバリ実行可能な方法を教えて頂ければ100ポイントさしあげます。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/09/13 12:25:19
  • 終了:--

回答(3件)

id:gzmgzm No.1

gzmgzm回答回数11ベストアンサー獲得回数02004/09/13 12:43:13

ポイント100pt

http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html

Java 2 プラットフォーム SE v1.4.0

詳しくはjava.lang.reflectを参照してください。

Javaでは、このようなことが簡単にできます。

私のサンプルを参照してください。

出かける時間が迫っていますので失礼します。

package com.acc_jp.jal;

//

import java.lang.reflect.*;

import java.net.*;

import java.rmi.*;

import java.util.*;

//

/**

* URLクラスローダを用いて、他のマシンより

* クラスファイルをダウンロードして実行する.

* <p>

* クラスファイルのサーバ側には、WebServerが稼動している必要がある.

* 実行するクラスには、mainメソッドが必要である.

*/

public class Loader

{

////////

//////// public methods

////////

/**

* main method

* <p>

* @param args[0 - n]: urls

* @param args[n+1]: class name

* @param args[n+2..] arguments

*/

public static void main(String args[])

{

try {

System.setSecurityManager(new RMISecurityManager());

//

ClassLoader classLoader = null;

URL[] urls;

Vector v = new Vector();

int i;

{ // get URLs

for (i=0; i<args.length; i++) {

if (args[i].startsWith(U)) {

v.add(args[i].substring(U.length()));

}

else { break; }

}

if (v.size() == 0) {

new Exception(”url not specified”);

}

urls = new URL[v.size()];

for (int j=0; j<v.size(); j++) {

urls[j] = new URL((String)v.get(j));

}

} // get URLs

classLoader = new URLClassLoader(urls);

//

Class targetClass = classLoader.loadClass(args[i]);

Method methods[] = targetClass.getMethods();

Method mainMethod = null;

for (int k=0; k<methods.length; k++) {

if (methods[k].getName().equals(”main”)) {

mainMethod = methods[k];

}

}

//

i++;

String realArgs[] = new String[args.length-i];

int j=0;

for (; i<args.length; i++,j++) {

realArgs[j] = args[i];

}

Object argsObj[] = new Object[1];

for (i=0; i<realArgs.length; i++) {

System.out.println(”Loader.args=”+realArgs[i]);

}

argsObj[0] = realArgs;

mainMethod.invoke(null,argsObj);

} catch(Exception e) {

e.printStackTrace();

}

} // main

////////

//////// private definitions

////////

private static final String U = ”-u”;

////////

//////// private constructors/methods

////////

private Loader() {} // not used

}

id:zeamix

なるほどーこれですね。ありがとうございます。

2004/09/13 12:50:36
id:kacchan6 No.2

kacchan6回答回数106ベストアンサー獲得回数02004/09/13 12:48:31

ポイント100pt

http://jakarta.apache.org/

The Jakarta Site - The Jakarta Project -- Java Related Products

1番目の質問ですが、コードでしょうか。コンパイル済みのクラスでしょうか。

コードでしたら、javacパッケージのMainクラスを実行してあげなければいけません。

tomcatのソースを参照すればいいと思います。

クラス名を外部ファイルから参照するのであれば、

ResourceBundle bundle = ResourceBundle.getBundle(”aaa.bbb.ccc”);//aaa.bbbがパッケージで、cccがpropertiesファイル

String clsName = bundle.getString(”cls”);//propertiesファイルからクラス名を取得

Class cls = Class.forName(clsName);//クラスオブジェクト取得

Object obj = cls.newInstance();クラスか

らインスタンス取得

Hoge hoge = (Hoge) obj;//キャストする

上記処理は例外処理をしていないので、try-catchして下さい。

対象のクラスにデフォルトコンストラクタが存在しない場合は、

リフレクション(java.lang.reclect.*)を使用する必要があります。

id:zeamix

なるほどー。ありがとうございます。

2004/09/13 12:54:34
id:gzmgzm No.3

gzmgzm回答回数11ベストアンサー獲得回数02004/09/13 12:49:37

URLはダミー。

最初の回答をしたものです。

URLは、http:...が普通ですが、

file:でも当然かまいません。

そうすると、WebServerを動かす必要はありません。

mainだけではなく、任意のメソッドも実行可能です。

id:zeamix

まだそこまで理解がすすんでませんが、糸口が見つかりましたありがとうございます。

2004/09/13 12:56:36

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • title title 2006-03-13 16:12:35
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません