使い方は, である.
配列 data内のさぐって, そのクラスの名前を取得し(jcf.className()), さらに 型が public void で引数ナシなメソッドを探して (loader.jcf.pubVoidMethods();), それを端から実行するという野蛮な例題である.
import java.io.*;
import java.lang.reflect.*;

public class LoadArrayR extends ClassLoader{
private byte[] data={
    (byte)0xCA, (byte)0xFE, (byte)0xBA, (byte)0xBE, (byte)0x00, 
    (byte)0x03, (byte)0x00, (byte)0x2D, (byte)0x00, (byte)0x29, 
    (byte)0x08, (byte)0x00, (byte)0x1D, (byte)0x08, (byte)0x00, 
    (byte)0x1E, (byte)0x07, (byte)0x00, (byte)0x18, (byte)0x07, 
    (byte)0x00, (byte)0x20, (byte)0x07, (byte)0x00, (byte)0x21, 
    (byte)0x07, (byte)0x00, (byte)0x22, (byte)0x07, (byte)0x00, 
    (byte)0x23, (byte)0x0A, (byte)0x00, (byte)0x03, (byte)0x00, 
    (byte)0x0D, (byte)0x0A, (byte)0x00, (byte)0x05, (byte)0x00, 
    (byte)0x0D, (byte)0x09, (byte)0x00, (byte)0x07, (byte)0x00, 
    (byte)0x0E, (byte)0x0A, (byte)0x00, (byte)0x04, (byte)0x00, 
    (byte)0x0F, (byte)0x0A, (byte)0x00, (byte)0x03, (byte)0x00, 
    (byte)0x10, (byte)0x0C, (byte)0x00, (byte)0x14, (byte)0x00, 
    (byte)0x11, (byte)0x0C, (byte)0x00, (byte)0x25, (byte)0x00, 
    (byte)0x1B, (byte)0x0C, (byte)0x00, (byte)0x26, (byte)0x00, 
    (byte)0x12, (byte)0x0C, (byte)0x00, (byte)0x27, (byte)0x00, 
    (byte)0x11, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x28, 
    (byte)0x29, (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x15, 
    (byte)0x28, (byte)0x4C, (byte)0x6A, (byte)0x61, (byte)0x76, 
    (byte)0x61, (byte)0x2F, (byte)0x6C, (byte)0x61, (byte)0x6E, 
    (byte)0x67, (byte)0x2F, (byte)0x53, (byte)0x74, (byte)0x72, 
    (byte)0x69, (byte)0x6E, (byte)0x67, (byte)0x3B, (byte)0x29, 
    (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x16, (byte)0x28, 
    (byte)0x5B, (byte)0x4C, (byte)0x6A, (byte)0x61, (byte)0x76, 
    (byte)0x61, (byte)0x2F, (byte)0x6C, (byte)0x61, (byte)0x6E, 
    (byte)0x67, (byte)0x2F, (byte)0x53, (byte)0x74, (byte)0x72, 
    (byte)0x69, (byte)0x6E, (byte)0x67, (byte)0x3B, (byte)0x29, 
    (byte)0x56, (byte)0x01, (byte)0x00, (byte)0x06, (byte)0x3C, 
    (byte)0x69, (byte)0x6E, (byte)0x69, (byte)0x74, (byte)0x3E, 
    (byte)0x01, (byte)0x00, (byte)0x04, (byte)0x43, (byte)0x6F, 
    (byte)0x64, (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x0D, 
    (byte)0x43, (byte)0x6F, (byte)0x6E, (byte)0x73, (byte)0x74, 
    (byte)0x61, (byte)0x6E, (byte)0x74, (byte)0x56, (byte)0x61, 
    (byte)0x6C, (byte)0x75, (byte)0x65, (byte)0x01, (byte)0x00, 
    (byte)0x0A, (byte)0x45, (byte)0x78, (byte)0x63, (byte)0x65, 
    (byte)0x70, (byte)0x74, (byte)0x69, (byte)0x6F, (byte)0x6E, 
    (byte)0x73, (byte)0x01, (byte)0x00, (byte)0x05, (byte)0x48, 
    (byte)0x65, (byte)0x6C, (byte)0x6C, (byte)0x6F, (byte)0x01, 
    (byte)0x00, (byte)0x0A, (byte)0x48, (byte)0x65, (byte)0x6C, 
    (byte)0x6C, (byte)0x6F, (byte)0x2E, (byte)0x6A, (byte)0x61, 
    (byte)0x76, (byte)0x61, (byte)0x01, (byte)0x00, (byte)0x0F, 
    (byte)0x4C, (byte)0x69, (byte)0x6E, (byte)0x65, (byte)0x4E, 
    (byte)0x75, (byte)0x6D, (byte)0x62, (byte)0x65, (byte)0x72, 
    (byte)0x54, (byte)0x61, (byte)0x62, (byte)0x6C, (byte)0x65, 
    (byte)0x01, (byte)0x00, (byte)0x15, (byte)0x4C, (byte)0x6A, 
    (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2F, (byte)0x69, 
    (byte)0x6F, (byte)0x2F, (byte)0x50, (byte)0x72, (byte)0x69, 
    (byte)0x6E, (byte)0x74, (byte)0x53, (byte)0x74, (byte)0x72, 
    (byte)0x65, (byte)0x61, (byte)0x6D, (byte)0x3B, (byte)0x01, 
    (byte)0x00, (byte)0x0E, (byte)0x4C, (byte)0x6F, (byte)0x63, 
    (byte)0x61, (byte)0x6C, (byte)0x56, (byte)0x61, (byte)0x72, 
    (byte)0x69, (byte)0x61, (byte)0x62, (byte)0x6C, (byte)0x65, 
    (byte)0x73, (byte)0x01, (byte)0x00, (byte)0x08, (byte)0x53, 
    (byte)0x61, (byte)0x79, (byte)0x20, (byte)0x72, (byte)0x75, 
    (byte)0x6E, (byte)0x21, (byte)0x01, (byte)0x00, (byte)0x0D, 
    (byte)0x53, (byte)0x61, (byte)0x79, (byte)0x20, (byte)0x73, 
    (byte)0x61, (byte)0x79, (byte)0x21, (byte)0x20, (byte)0x61, 
    (byte)0x6E, (byte)0x64, (byte)0x20, (byte)0x01, (byte)0x00, 
    (byte)0x0A, (byte)0x53, (byte)0x6F, (byte)0x75, (byte)0x72, 
    (byte)0x63, (byte)0x65, (byte)0x46, (byte)0x69, (byte)0x6C, 
    (byte)0x65, (byte)0x01, (byte)0x00, (byte)0x13, (byte)0x6A, 
    (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2F, (byte)0x69, 
    (byte)0x6F, (byte)0x2F, (byte)0x50, (byte)0x72, (byte)0x69, 
    (byte)0x6E, (byte)0x74, (byte)0x53, (byte)0x74, (byte)0x72, 
    (byte)0x65, (byte)0x61, (byte)0x6D, (byte)0x01, (byte)0x00, 
    (byte)0x10, (byte)0x6A, (byte)0x61, (byte)0x76, (byte)0x61, 
    (byte)0x2F, (byte)0x6C, (byte)0x61, (byte)0x6E, (byte)0x67, 
    (byte)0x2F, (byte)0x4F, (byte)0x62, (byte)0x6A, (byte)0x65, 
    (byte)0x63, (byte)0x74, (byte)0x01, (byte)0x00, (byte)0x12, 
    (byte)0x6A, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2F, 
    (byte)0x6C, (byte)0x61, (byte)0x6E, (byte)0x67, (byte)0x2F, 
    (byte)0x52, (byte)0x75, (byte)0x6E, (byte)0x6E, (byte)0x61, 
    (byte)0x62, (byte)0x6C, (byte)0x65, (byte)0x01, (byte)0x00, 
    (byte)0x10, (byte)0x6A, (byte)0x61, (byte)0x76, (byte)0x61, 
    (byte)0x2F, (byte)0x6C, (byte)0x61, (byte)0x6E, (byte)0x67, 
    (byte)0x2F, (byte)0x53, (byte)0x79, (byte)0x73, (byte)0x74, 
    (byte)0x65, (byte)0x6D, (byte)0x01, (byte)0x00, (byte)0x04, 
    (byte)0x6D, (byte)0x61, (byte)0x69, (byte)0x6E, (byte)0x01, 
    (byte)0x00, (byte)0x03, (byte)0x6F, (byte)0x75, (byte)0x74, 
    (byte)0x01, (byte)0x00, (byte)0x07, (byte)0x70, (byte)0x72, 
    (byte)0x69, (byte)0x6E, (byte)0x74, (byte)0x6C, (byte)0x6E, 
    (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x72, (byte)0x75, 
    (byte)0x6E, (byte)0x01, (byte)0x00, (byte)0x03, (byte)0x73, 
    (byte)0x61, (byte)0x79, (byte)0x00, (byte)0x21, (byte)0x00, 
    (byte)0x03, (byte)0x00, (byte)0x05, (byte)0x00, (byte)0x01, 
    (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x04, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x27, 
    (byte)0x00, (byte)0x11, (byte)0x00, (byte)0x01, (byte)0x00, 
    (byte)0x15, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x25, 
    (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, (byte)0x00, 
    (byte)0x00, (byte)0x00, (byte)0x09, (byte)0xB2, (byte)0x00, 
    (byte)0x0A, (byte)0x12, (byte)0x01, (byte)0xB6, (byte)0x00, 
    (byte)0x0B, (byte)0xB1, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x01, (byte)0x00, (byte)0x1A, (byte)0x00, (byte)0x00, 
    (byte)0x00, (byte)0x0A, (byte)0x00, (byte)0x02, (byte)0x00, 
    (byte)0x00, (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x08, 
    (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, (byte)0x00, 
    (byte)0x28, (byte)0x00, (byte)0x11, (byte)0x00, (byte)0x01, 
    (byte)0x00, (byte)0x15, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x2D, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x01, 
    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0D, (byte)0xB2, 
    (byte)0x00, (byte)0x0A, (byte)0x12, (byte)0x02, (byte)0xB6, 
    (byte)0x00, (byte)0x0B, (byte)0x2A, (byte)0xB6, (byte)0x00, 
    (byte)0x0C, (byte)0xB1, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x01, (byte)0x00, (byte)0x1A, (byte)0x00, (byte)0x00, 
    (byte)0x00, (byte)0x0E, (byte)0x00, (byte)0x03, (byte)0x00, 
    (byte)0x00, (byte)0x00, (byte)0x07, (byte)0x00, (byte)0x08, 
    (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x0C, (byte)0x00, 
    (byte)0x06, (byte)0x00, (byte)0x09, (byte)0x00, (byte)0x24, 
    (byte)0x00, (byte)0x13, (byte)0x00, (byte)0x01, (byte)0x00, 
    (byte)0x15, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x2D, 
    (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x02, (byte)0x00, 
    (byte)0x00, (byte)0x00, (byte)0x0D, (byte)0xBB, (byte)0x00, 
    (byte)0x03, (byte)0x59, (byte)0xB7, (byte)0x00, (byte)0x08, 
    (byte)0x4C, (byte)0x2B, (byte)0xB6, (byte)0x00, (byte)0x0C, 
    (byte)0xB1, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01, 
    (byte)0x00, (byte)0x1A, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x0E, (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x00, 
    (byte)0x00, (byte)0x0C, (byte)0x00, (byte)0x08, (byte)0x00, 
    (byte)0x0D, (byte)0x00, (byte)0x0C, (byte)0x00, (byte)0x0B, 
    (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x14, (byte)0x00, 
    (byte)0x11, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x15, 
    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x1D, (byte)0x00, 
    (byte)0x01, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00, 
    (byte)0x00, (byte)0x05, (byte)0x2A, (byte)0xB7, (byte)0x00, 
    (byte)0x09, (byte)0xB1, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x01, (byte)0x00, (byte)0x1A, (byte)0x00, (byte)0x00, 
    (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x01, (byte)0x00, 
    (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x01, 
    (byte)0x00, (byte)0x1F, (byte)0x00, (byte)0x00, (byte)0x00, 
    (byte)0x02, (byte)0x00, (byte)0x19
}; // 648(d) bytes, extended to about 3240(d) bytecodes

private String myname;
Jcf jcf;

    public LoadArrayR(){
        jcf=new Jcf(data);
        myname=jcf.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;
    }

    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[]){
        LoadArrayR loader=new LoadArrayR();
        try{
            Class c=loader.loadClass(loader.lcname());
            Object o=c.newInstance();
            String[][] mes=loader.jcf.pubVoidMethods();
            for(int i=0; i<mes.length; i++){
                System.out.println("# Invoke: "+mes[i][0]);
                Method m=c.getMethod(mes[i][0], null);
                m.invoke(o, null);
            }
        }catch(Throwable e){
            e.printStackTrace();
        }
    }
}

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