发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA
1 2 3 4 ... 5 下一页 Go 5

怎样拦截classloader实现类方法截获

         
2007-04-23 22:10
赞助商链接

我目前正在开发的一个组件想实现一个功能: 就是通过配置文件配置类名,就能够拦截该类所有方法的调用,而该类可能没有实现任何接口,并且这个过程对于系统程序是透明的,我想在虚拟机这层解决这个问题,对于组件的部署都是非常有帮助的.

目前我的想法就是通过拦截classloader,或者实现自己的classloader,另外通过修改原class的字解码实现拦截方法。但是遇到2个难题:
1)classloader的拦截似乎并不那么听话,我是通过Thread.setContextClassLoader()来设置自己的classloader,但是似乎对于下面的程序,并不一定就会采用我设置的classloader工作,在多个容器和JDK版本下试过,行为有点不一样,而SUN在这方面的资料又非常匮乏。
2)字解码修改,往往我需要代理的类在我的组件运行时已经被上层classloader加载,这时试图修改该类的字解码,会引起JVM报错,比如重复加载之类的错误。

由于资料非常匮乏,所以,非常希望有这方面经验的人,能够给大家讲解一下虚拟机加载类的时序,已经类生存的周期,命名空间,以及安全控制等问题,当然最重要的是告诉我怎么实现我想要的功能,呵呵。

2007-04-23 22:14

自己顶一个,麻烦BENQ大哥帮我的贴提一提,欢迎大家讨论。

2007-04-23 22:21

之前,我通过修改cglib的代码,把字解码生成出来,但是把这个类的名称定义成和我要代理的类一样时,通过调用容器classloader的defineClass方法,会出现类重复定义的错误。
然后,我就通过定义自己的classLoader,把容器的ClassLoader定义成父,这样defineClass也许不会重复,还没试过。

我有个疑问,JVM对于已经加载的类是怎么管理的,是不是所有的classloader加载的类在JVM内部是共享的?因为defineClass本身是JVM内部实现的,是不是对于所有classloader定义一个类时,都是加载到JVM内部的一个共享的存储空间?不得而知。

2007-04-23 22:23

望有缘人指条明路啊,头疼

2007-04-23 23:38

现在,我设计的一个模型是:把自己定义的classloader定义为容器的classloader的子,那么怎么更新已经加载的类为通过字解码编辑后的类呢?

现在基本上没有想到办法在classloader上重新更新一个已经加载的类,重新LoadClass是没有意义的,无非从缓存里取出原来的类而以,重新defineClass就会收到类定义重复的错误,如果通过实现自己的classloader来define修改后的Class,是不会报错了,但是非常危险吧(我不知道,感觉而已),因为容器的classloader已经加载了该类,现在自定义的classloader也加载了更新后的类,但是系统在运行时不确定会使用哪一个classloader来得到该类,哪怕设置自定义classloader为线程ContextLoader,也没用,引用者类如果是容器的classloader加载的,那么它引用的类A也必然是通过容器classloader加载,只有新的才会使用我自定义的类来加载新的类A,那么系统就存在2个不同版本但是同名的类,危险自然不必说了。

没什么思路了。除非以我的classloader来启动整个容器?可怕的想法

5Go 1 2 3 4 ... 5 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com