搜索引擎优化网站,中文域名做的网站,什么是h5开发,搜索引擎大全入口背景#xff1a;
对于某些jar包#xff0c;其内部是存在bug的#xff0c;解决的方法无外乎就有以下几种方法#xff1a; #xff08;1#xff09;通过反射#xff0c;修改其赋值逻辑 #xff08;2#xff09;通过继承#xff0c;重写其方法 #xff08;3#xff0…背景
对于某些jar包其内部是存在bug的解决的方法无外乎就有以下几种方法 1通过反射修改其赋值逻辑 2通过继承重写其方法 3修改jar包的源码从根源上修复问题 对于改动量难易程度1和2都是比较适合的但是有些情况下不能满足修改条件所以就有了方案3要不就乖乖等官方jar包版本更新。
环境
1win10 2jdk11 3jd查看工具下载版本jd-gui-1.6.6.jar
实战
举个例子以aliyun-vod-upload-android-sdk-1.6.5.jar为例。其中 类AliyunVodAuth181行有个空指针判断没有做导致了程序报错报错信息如下
com.alibaba.sdk.android.vod.upload.auth.AliyunVodAuth$2$1.onFailure(AliyunVodAuth.java:181)
com.aliyun.vod.qupaiokhttp.OkHttpTask.onPostExecute(OkHttpTask.java:279)
com.aliyun.vod.qupaiokhttp.OkHttpTask$2.run(OkHttpTask.java:228)
android.os.Handler.handleCallback(Handler.java:942)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loopOnce(Looper.java:211)
android.os.Looper.loop(Looper.java:300)
android.app.ActivityThread.main(ActivityThread.java:8152)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)因为这个包目前位置已经是官方最新的jar包了所以等官方更新也不知道要等到什么时候因此就需要手动修改jar包里面的内容了。
一提取文件修改保存
报错代码实际源码如下
if (var1x 1003) {AliyunVodAuth.this.vodAuthCallBack.onError(AliyunVodErrorCode.VODERRORCODE_HTTP_ABNORMAL, http error response unknown.);}可见是vodAuthCallBack没有判空导致的。因为我们修改的过程中只需要加上一个判空即可。
确定报错的类源码如下图 然后选中该类点击FIle–Save。保存该类到本地。然后在对应保存的目录下就会有一个保存后的java文件然后修改文件中的判断如下图 修改后保存
一通过java c编译生成class文件
找出类中对应的依赖jar包这个类中依赖的jar包为 gson.jar,okhttp.jar所以需要这两个包才能执行javac 可执行目录的依赖如下 然后在dos指令窗口输入以下指令
执行指令如下 javac -cp aliyun-vod-upload-android-sdk-1.6.5.jar;E:\Android\sdk\platforms\android-30\android.jar;okhttp-4.5.0.jar;gson-2.10.1.jar *.java
其中,cp代表编译的时候涉及到哪些依赖文件window中用;分割而*.java代表目录下的所有.java格式的文件也可以指定某个java类。
最后执行命令生成以下文件 然后赋值对应生成的.class文件覆盖原有文件即可使用。
that‘s all------------------------------------------------------------------------------------------------------