使い方は, など. 要は引数で与えたURLに当該のクラスデータがあれば, ネットワークを介して,それをダウンロードをし, 第2引数に指定されているメソッド(があればそれ)を実行するということ.
import java.io.*;
import java.net.*;
import java.lang.reflect.*;

public class LoadNetR extends ClassLoader{
private byte[] data;
private String myname;

    public LoadNetR(String url){
        readBytes(url);
        myname=new Jcf(data).className();
    }

    String lcname(){return myname;}

    protected Class loadClass(String name, boolean resolve)
    throws ClassNotFoundException{
        Class clazz = null;

        try{ return findSystemClass(name); }
        catch(Throwable e){}

        clazz=findLoadedClass(name);
        if(clazz != null){ return clazz; }

        clazz=myFindClass(name);
        if(clazz == null ){ throw new ClassNotFoundException(name); }

        if(resolve){ resolveClass(clazz); }

        return clazz;
    }

    void readBytes(String u){
        data=new byte[4096];
        int total=0, n;
        try{
            URL url=new URL(u);
            InputStream is=url.openStream();
            while((n=is.read(data,total,data.length-total))>=0){
                if((total+=n) == data.length){
                    byte newdata[]=new byte[total*2];
                    System.arraycopy(data, 0, newdata, 0, total);
                    data = newdata;
                }
            }
            byte[] b=new byte[total];
            System.arraycopy(data, 0, b, 0, total);
            data=b;
        }catch(IOException e){}
    }

    private synchronized Class myFindClass(String name){
        try{
            return defineClass(name, data, 0, data.length);
        }catch(Throwable e){
            System.out.println(e.getMessage());
            throw new ClassFormatError();
        }
    }

    public static void main(String args[]){
        LoadNetR loader=new LoadNetR(args[0]);
        try{
            Class c=loader.loadClass(loader.lcname());
            Object o=c.newInstance();
            Method m=c.getMethod(args[1], null);
            m.invoke(o, null);
        }catch(Throwable e){
            e.printStackTrace();
        }
    }
}

$Id: reflect.html,v 1.1 2002-07-14 22:19:31+09 kaiya Exp kaiya $