Tomcat等JAVA应用服务器,默认情况下是不支持中文的URL访问路径的,我们可以通过自己添加滤镜的方法让其支持,具体代码如下:
2009年3月11日星期三
让JAVA应用服务器支持中文URL路径
作者 Unknown 时间 18:39:00 0 comments 日志分类: JAVA
2008年7月6日星期日
JAVA反编译探讨-javassist & jclasslib
最近由于一个项目,需要对无源码的Class类修改其中一个方法,只好采用反编译,得到的源码虽然无语法错误,但产生了逻辑错误,具体原因是反编译可能产生类型转换出错或运算优先级出错,之前的文章有讨论到。
经过google一把之后,找到javassist,感觉好像可以,看看例子,使用方法很简单,可以不需反编译直接修改class的函数体,经过试验,修改函数体到时成功了,不过这东东仍然没有解决问题,虽然没有深入研究javassist,但感觉他修改了不仅仅是我需要修改的函数,其它函数也被修改了,与反编译产生的BUG一样,所以这鸟东东也只是中看不中用。
再google一把,找到jclasslib,可以直接修改字节码,不过这东东需要去熟悉JVM指令,比较烦,看来还是老老实实地看反编译后的源文件,找出其中反编译有误的地方,一一修正吧,有时最常用的办法,就是最好的办法。
作者 Unknown 时间 22:22:00 0 comments 日志分类: JAVA
JAVA反编译探讨-运算优先级
废话少说,直接来看一下源代码,如下:
public class Test {
public static void main(String[] args) {
int i = 3;
i = (++i) + (++i);
System.out.println("i=" + i);
}
}
运行结果:
i=9
反编译得到的源码如下:
public class Test{
public Test(){
}
public static void main(String args[]){
int i = 3;
i = i++ + i;
System.out.println("i=" + i);
}
}
运行结果为:
i=7
呵呵,看来反编译并不可靠呀。
作者 Unknown 时间 21:56:00 1 comments 日志分类: JAVA
2008年7月5日星期六
JAVA反编译探讨-类型转换
最近在做Maximo的过程中,反编译一个Class之后,得到的源码无任何语法错误,但是编译回去之后,运行时却报Stack OverflowError,经过努力发现原来Java反编译在类型转换过程中存在问题。
例:源码如下:
public void setValue(int value){
setValue( (long)value);
}
public void setValue(long value){
this.longvalue = value;
}
以上代码,运行不会出错,但经过编译后,再将类进行反编译得到的源码如下:
public void setValue(int value){
setValue(value);
}
public void setValue(long value){
this.longvalue = value;
}
由此我们看到,反编译之后,将long类型直接转换为int类型了,所以setValue(int value)函数将出现递归死循环,导致Stack OverflowError也就很正常了。
反编译会出现类型转换错的,还包括将double与float类型之间的转换,至于其它的类型是否还会出错,暂时没有做深入研究。
作者 Unknown 时间 23:24:00 0 comments 日志分类: JAVA