人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: zeamix
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:クラス コード ズバリ ファイル プログラム
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● gzmgzm
●100ポイント

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

}

◎質問者からの返答

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


2 ● kacchan6
●100ポイント

http://jakarta.apache.org/

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

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

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

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

http://my.yahoo.co.jp/

My Yahoo!

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

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.*)を使用する必要があります。

◎質問者からの返答

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


3 ● gzmgzm
●0ポイント

http://www.alpha-net.ne.jp/users2/gzmgzm/

URLはダミー。

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

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

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

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ