以前沒(méi)有注意過(guò),其實(shí)java編譯成.class 有兩種方式
使用javac,默認使用的release方式,而我們經(jīng)常使用的MyEclipse工具,用的是debug模式。
區別暫時(shí)了解如下:
release模式下對于函數參數會(huì )改變
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ā)現,使用javac命令產(chǎn)生的Test.class(如下)和用MyEclipse編譯(如下)出來(lái)的參數名上有所區別
[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的注解初始化參數建議指定名稱(chēng)
[html]
view plaincopy@RequestMapping(/test/{str})
public String test(@PathVariable String str){
System.out.println(str);
return null;
}
實(shí)際項目部署使用的是release版本,這樣str而非RequestMapping中的{str}這樣就對應不起來(lái)了。而這樣的問(wèn)題在開(kāi)發(fā)中是不會(huì )發(fā)現的
Java文件編譯的兩種方式以及在SpringMVC傳參中帶來(lái)的問(wèn)題(轉)
(2013-08-26 10:26:46)
標簽:
springmvcdebugreleaseit分類(lèi):
JavaEE一、基本概念
java編譯成.class 有兩種方式。使用javac,默認使用的release方式,而使用的MyEclipse工具,用的是debug模式。值得注意的是使用release模式下對于函數參數會(huì )改變。
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ā)現區別。
使用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ā)現問(wèn)題
以SpringMVC為例
@RequestMapping(/test/{str})
public String test(@PathVariable String str){
System.out.println(str);
return null;
}
實(shí)際項目部署使用的是release版本,這樣str經(jīng)過(guò)編譯后就和RequestMapping中的{str}這樣就對應不起來(lái)了。而這樣的問(wèn)題在開(kāi)發(fā)中是不會(huì )發(fā)現的。這也可以解釋為什么在spring MVC 中controller的注解初始化參數建議指定名稱(chēng)。建議寫(xiě)法如下:
@RequestMapping(/test/{str})
public String test(@PathVariable("str") String str){
System.out.println(str);
return null;
}