如何覆盖jar包里面的方法

4 篇文章 0 订阅
起始要覆盖一个jar包里面的方法很简单,先看下面三张图


        这里解释一下:第一张图是没覆盖jar包方法之前的输出,正常输出了一个对象转换成json字符串的结果,第二张图是我覆盖了JSON.toJSON()这个方法之后的输出。

        其实要完全覆盖一个Jar包的方法很简单,第一步你需要在你的src目录下新建一个同包名同类名的类(有点拗口,哈哈),第二步你想修改那个方法就改那天,最后编译输出的时候会优先使用你src下面的JSON类,而不是优先使用Jar包里面的JSON类,这样就达到了覆盖jar包方法了。

        再说一点,你自己新建出来的类,起始同包同类名还不行,还需要那个类里面的方法必须和jar包的全部一致,不能缺少方法,不然你想想,你写了一个JSON只有一个方法,人家jar包里面的可能几十个方法,jar包里面也互相调用了JSON这个对象缺少了方法肯定是有问题的最好的办法就是完全复制一个过去再修改。

        这样做有什么好处呢,假如你下载了一个开源的jar包,发现里面有一个方法写得很烂,怎么办?等作者更新?继承?当然也可以,但是你发现的写得很烂的方法是一个private怎么办?这个时候整个类都覆盖掉,爱怎么改就怎么改了。好处不用我再多说了吧。觉得有用就点个赞呗,呵呵。

        当前,上面说得这么多有一个前提就是,这个jar包的源码你得有,不然也谈不上优化了,对不对。


参考:http://tieba.baidu.com/p/4507553753


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
在jdk1.2以后,加载是通过委托来完成的,这意味着如果 ClassLoader 不能找到,它会请求父代 ClassLoader 来执行此项任务,所有 ClassLoaders 的根是系统 ClassLoader,它会以缺省方式装入 -- 即,从本地文件系统。今天我们就来探讨一下在jvm中这些机制是怎样运行的。让我们假设有一个class字节码文件(比如Hello.class文件),那么在应用程序中,他是如何被加载进来,并形成一个对象的呢?我们这篇文章的目的就是为了解释这个问题。 在java.lang包里有个ClassLoader,ClassLoader 的基本目标是对的请求提供服务。当 JVM 需要使用时,它根据名称向 ClassLoader 请求这个,然后 ClassLoader 试图返回一个表示这个的 Class 对象。通过覆盖对应于这个过程不同阶段的方法,可以创建定制的 ClassLoader。其中有个loadClass(String name, boolean resolve)方法,该方法为ClassLoader的入口点,在jdk1.2以后,loadClass方法将缺省调用findClass方法,详细内容可以参考API文档,我们编写的ClassLoader主要就是为了覆盖以上两个方法。回到我们刚才的问题,怎样读进字节码文件,并把它构成一个对象呢?在ClassLoader里有个方法,Class defineClass(String name, byte[] b, int off, int len),答案就在这里了,我们根据把class字节码文件(如Hello.class)读进一个字节数组里,byte[] b,并把它转化为Class对象,而这些数据可以来源于文件,网络等,神奇吧:) defineClass管理 JVM 的许多复杂、神秘和倚赖于实现的方面 -- 它把字节码分析成运行时数据结构、校验有效性等等。不必担心,您无需亲自编写它。事实上,即使您想要这么做也不能覆盖它,因为它已被标记成最终的。 其他一些方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值