以前沒有注意過,其實java編譯成.class 有兩種方式
使用javac,默認(rèn)使用的release方式,而我們經(jīng)常使用的MyEclipse工具,用的是debug模式。
區(qū)別暫時了解如下:
release模式下對于函數(shù)參數(shù)會改變
Test.java
[java]
view plaincopypublic class Test{
private static void sayHello(){
System.out.println("Hello world");
}
public static void main(String[] args){
sayHello();
}
}
分別用javac命令,和MyEclipse IDE編譯上面的Test.java
然后使用jd-gui.exe 查看Test.class
可以發(fā)現(xiàn),使用javac命令產(chǎn)生的Test.class(如下)和用MyEclipse編譯(如下)出來的參數(shù)名上有所區(qū)別
[java]
view plaincopypublic class Test
{
private static void sayHello()
{
System.out.println("Hello world");
}
public static void main(String[] args) {
sayHello();
}
}
[java]
view plaincopypublic class Test
{
private static void sayHello()
{
System.out.println("Hello world");
}
public static void main(String[] paramArrayOfString) {
sayHello();
}
}
這也可以解釋為什么在spring MVC 中controller的注解初始化參數(shù)建議指定名稱
[html]
view plaincopy@RequestMapping(/test/{str})
public String test(@PathVariable String str){
System.out.println(str);
return null;
}
實際項目部署使用的是release版本,這樣str而非RequestMapping中的{str}這樣就對應(yīng)不起來了。而這樣的問題在開發(fā)中是不會發(fā)現(xiàn)的
Java文件編譯的兩種方式以及在SpringMVC傳參中帶來的問題(轉(zhuǎn))
(2013-08-26 10:26:46)
標(biāo)簽:
springmvcdebugreleaseit分類:
JavaEE一、基本概念
java編譯成.class 有兩種方式。使用javac,默認(rèn)使用的release方式,而使用的MyEclipse工具,用的是debug模式。值得注意的是使用release模式下對于函數(shù)參數(shù)會改變。
public class Test{
private static void sayHello(){
System.out.println("Hello world");
}
public static void main(String[] args){
sayHello();
}
}
以上代碼分別用javac命令和MyEclipse IDE編譯,然后使用jd-gui.exe查看Test.class,可以發(fā)現(xiàn)區(qū)別。
使用MyEclipse編譯(debug)
public class Test
{
private static void sayHello()
{
System.out.println("Hello world");
}
public static void main(String[] args) {
sayHello();
}
}
使用javac編譯(release)
public class Test
{
private static void sayHello()
{
System.out.println("Hello world");
}
public static void main(String[] paramArrayOfString) {
sayHello();
}
}
二、發(fā)現(xiàn)問題
以SpringMVC為例
@RequestMapping(/test/{str})
public String test(@PathVariable String str){
System.out.println(str);
return null;
}
實際項目部署使用的是release版本,這樣str經(jīng)過編譯后就和RequestMapping中的{str}這樣就對應(yīng)不起來了。而這樣的問題在開發(fā)中是不會發(fā)現(xiàn)的。這也可以解釋為什么在spring MVC 中controller的注解初始化參數(shù)建議指定名稱。建議寫法如下:
@RequestMapping(/test/{str})
public String test(@PathVariable("str") String str){
System.out.println(str);
return null;
}