リフレクション

30分プログラム、その198。Javaのリフレクション。

やることが思いつかないので、昔のプログラムをひっぱりだしてきて、お茶を濁す。動機は、

  1. Javaって遅いよなぁ
  2. 遅いのは最初にVMを立ち上げるときだよな
  3. じゃあ、VMを立ち上げたままにしとけばいいんじゃね?
  4. Javaプログラムを起動するための常駐プログラムを書こう

プログラム自体は成功したんだけど、使いたいプログラム(Maven2)は結局速くならなかった。何に時間がかかってるんだろう?

使い方

# 普通に起動する場合
$ java Hello mzp
Hello,mzp!

# 常駐プログラムで起動する
$ java CLTest Hello
# mainの呼び出し
> mzp
Hello,mzp!

> hoge
Hello,hoge!

ソースコード

import java.io.*;
import java.lang.reflect.Method;
import java.security.*;

class CLTest{
    class MySecurity extends SecurityManager{
	public void checkExit(int exit){
	    throw new SecurityException();
	}
	public void checkPermission(Permission perm){
	}
    }

    public void loop(Method main){
	// exitを許可しない
	System.setSecurityManager(new MySecurity());
	BufferedReader d =
	    new BufferedReader(new InputStreamReader(System.in));

	try{
	    while(true){
		try{
		    System.out.print("> ");
		    String str = d.readLine();
		    main.invoke(null,new Object[]{ str.split(" ") });
		}catch(Exception e){
		}
	    }
	}catch(Exception e){
	    e.printStackTrace();
	}
    }
    public static void main(String args[]){
	CLTest t = new CLTest();
	ClassLoader cl = CLTest.class.getClassLoader();
	try{
	    Class c = cl.loadClass(args[0]);
	    Method method = c.getMethod("main",new Class[]{ String[].class });

	    t.loop(method);
	}catch(Exception e){
	    e.printStackTrace();
	}
    }
}