动态java代码的使用方法

来源: 作者:佚名 2008-03-25 出处:pcdog.com

j2se  java  jsp  ssl  代理服务器  
上一页 1 2 3 下一页 

 public class PostmanImpl implements Postman {

    private PrintStream output;
   
    public PostmanImpl() throws IOException {
       output = new PrintStream(new FileOutputStream("msg.txt"));
    }

    public void deliverMessage(String msg) {
        output.println("[Postman] " + msg);
        output.flush();
    }
}


    在程序运行中,我们就是要通过动态修改PostmanImpl 来观察这个JSP一样的现象。 

    3,访问服务 

    这里要介绍一些访问服务的main程序,以便看到这种方式的优越性。

 public class PostmanApp {

    public static void main(String[] args) throws Exception {
        BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
        Postman postman = getPostman();
        while (true) {
            System.out.print("Enter a message: ");
            String msg = sysin.readLine();
            postman.deliverMessage(msg);
        }
    }

    private static Postman getPostman() {
        DynaCode dynacode = new DynaCode();
        dynacode.addSourceDir(new File("dynacode"));
        return (Postman) dynacode.newProxyInstance(Postman.class,
                "sample.PostmanImpl");
    }
}


    我们可以看到获取PostMan对象,只是在初始化的过程中做过一次,后边只是访问其deliverMessage()方法,    而 sample.PostmanImpl这一实现的动态改变完全被掩藏在这个小小框架的后边。Java文件改变后的编译、重新载入、对象实例化和方法的调用过程完全不可见,是不是很神奇的实现。

    4,DynaCode 

    看了这样的主程序,你可能会首先看一下DynaCode的实现,然而我不准备详细讲述DynaCode的实现,尽管它的实现最为复杂。因为 DynaCode只是简单的包装了java.lang.reflect.Proxy,通过添加几个处理class路径和java路径的方法辅助来完成工作的,我不想重点介绍java反射机制的,因此我们只来看DynaCode一个重要的方法。

 public Object newProxyInstance(Class interfaceClass, String implClassName)
            throws RuntimeException {
        MyInvocationHandler handler = new MyInvocationHandler(
                implClassName);
        return Proxy.newProxyInstance(interfaceClass.getClassLoader(),
                new Class[] { interfaceClass }, handler);
}

     好了,看到了吧,DynaCode只是在内部做了一个InvocationHandler实现,并简单的使用了Proxy的newProxyInstance()方法。



上一页 1 2 3 下一页 
上一篇:EJB3.1计划中的特性
下一篇:专访Java之父Gosling:纵观Sun的开源