// $Id: LoadStdinR.java,v 1.1 2002-07-14 22:09:23+09 kaiya Exp kaiya $ import java.io.*; import java.lang.reflect.*; public class LoadStdinR extends ClassLoader{ private byte[] data; private String myname; public LoadStdinR(InputStream i){ readBytes(i); 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(InputStream is){ data=new byte[4096]; int total=0, n; try{ 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[]){ LoadStdinR loader=new LoadStdinR(System.in); try{ Class c=loader.loadClass(loader.lcname()); Object o=c.newInstance(); Method m=c.getMethod(args[0], null); m.invoke(o, null); }catch(Throwable e){ e.printStackTrace(); } } }