让你的Java应用具有动态加载的功能

    今天看到了javaworld上的一篇文章,该文章讨论了通过结合JVM的类加载机制、Java语言的动态代理技术以及Java的编译技术来实现一个类的动态加载功能,具体可参考http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

     该文章中给出的源代码中,对Java源代码的编译中依赖于sun的类库,在JDK1.6中,引入了Java的编译API,我们可以修改改代码,让其应用JDK1.6编译API。其实现原理是定期去检查源代码的文件是否被更新,如果被更新了,则重新编译改源代码然后重新载入,更新其类的定义。我们可以考虑基于事件机制,而不是去定期检查源代码的更新情况来实现动态加载。毕竟动态检查源代码对性能还是有消耗的,特别是当源代码文件数比较多的时候。

     我的想法是这样子的,用户可以触发一个事件,例如用户可以提供一个类的全名,告诉Java应用这个类已经被修改,该类被修改的事件将被分发到自定义的类加载器中,类加载器收到该事件后重新编译该类文件,生成相应的字节码,然后重新载入。当然为了方便使用,用户不一定要提供一个类的全名,用户可以提供一个包的名字,让后这个包下的所以类将被重新载入,或者更进一步根据正则表达式来匹配。

     事实上,最终提供给Java应有的类是由动态代理生成的,在这种机制下,用户不但可以触发类文件被修改的事件,还可以触发其他事件,例如用户可以触发事件让一些类处于调试模式,这个可以用AOP做到,因为我们在创建动态代理的时候可以对其进行增强。当然如果Cache是用AOP来实现的话,用户还可以触发事件告诉Java应用是否进行Cache。而所有这些都是在不用重启应有的情况下做到的。

    具体一点,自定义的类加载器可以实现监听者接口,而事件触发器提供方法添加监听器的方法,当相应的事件被触发后所有的注册的监听者将收到改事件信息。^_^,可以考虑在原作者的代码基础上进行更进一步的开发。

你可能感兴趣的:(java,jvm,AOP,正则表达式,cache)