Java為什麼沒有預編譯命令
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。
② java預編譯的問題,其中sql語句執行不了,其他插入什麼的都正常,望指點~
pstmt.setString(1,user.getId()+"");
pstmt.setString(2,user.getName());
pstmt.setString(3,user.getPwd());
這是以佔位符方式設置 sql的參數值。
你的sql語句String sql = "select id,name,pwd from userinfo where id=10007";
沒有用到,所以這幾句刪了就行了。或者改為:
String sql = "select id,name,pwd from userinfo where id=?";
pstmt.setString(1,user.getId()+"");
③ Java中PreparedStatement和Statement有什麼區別 在安全性上
PreparedStatement 可以自己set 值進去 , 而 Statement 只是簡單的拼 SQL。所以PreparedStatement相對要安全得多。
like :table Test 裡面有兩個值 name,age
PreparedStatement p=null;
String sql2 =
"delete from test where age < :x ";
pst2 = conn.prepareStatement(sql2);
pst2.setInt(1, 10); // 這里的10 為之前 :x 處應該傳進去的值
而如果是用 Statement
like:
Statement s = conn.createStatement();
String sql = "delete from test where age < " + x; // x=10
s.execute(sql);
想想 這里 要是傳進來的x 是 10 and name='xx' 呢?
sql = "delete from test where age < 10 and name='xx' "
是不是 Statement 也照樣執行了 所以這樣很不安全 因為別人可以隨意傳數值,和參數。
要是 jion 別的table? 天 你什麼信息都可能被拿走
而如果是PreparedStatement.setString() 的話 只會把你傳進來的當做參數的 值,
上面那種會變成
sql = "delete from test where age <『10 and name='xx'』 " 這樣是不會有問題滴
④ java中什麼是預編譯precompile
預編譯的作用就是把所以的代碼都運行一遍,等你程序運行到模塊A,這個時候需要到B模塊,就可以直接調用,效果是啟動慢,運行快;所以也稱JAVA為靜態語言,動態語言如JavaScript,特性就是當程序運行到C的時候需要調用D模塊,這個時候才會編譯D模塊。希望對你有幫助,謝謝
⑤ 棰勭紪璇戜負浠涔堝彲浠ラ槻姝sql娉ㄥ叆
棰勭紪璇戝彲浠ラ槻姝sql娉ㄥ叆鐨勫師鍥狅細榪涜岄勭紪璇戜箣鍚庯紝sql璇鍙ュ凡緇忚鏁版嵁搴撳垎鏋愶紝緙栬瘧鍜屼紭鍖栦簡錛屽苟涓斿厑璁告暟鎹搴撲互鍙傛暟鍖栫殑褰㈠紡榪涜屾煡璇錛屾墍浠ュ嵆浣挎湁鏁忔劅瀛楃︽暟鎹搴撲篃浼氬綋鍋氬睘鎬у兼潵澶勭悊鑰屼笉鏄痵ql鎸囦護浜
澶у墮兘鐭ラ亾錛宩ava涓璊DBC涓錛屾湁涓棰勫勭悊鍔熻兘錛岃繖涓鍔熻兘涓澶т紭鍔垮氨鏄鑳芥彁楂樻墽琛岄熷害灝ゅ叾鏄澶氭℃搷浣滄暟鎹搴撶殑鎯呭喌錛屽啀涓涓浼樺娍灝辨槸棰勯槻SQL娉ㄥ叆錛屼弗鏍肩殑璇達紝搴旇ユ槸棰勯槻緇濆ぇ澶氭暟鐨凷QL娉ㄥ叆銆
鐢ㄦ硶灝辨槸濡備笅杈規墍紺猴細
String sql="update cz_zj_directpayment dp"+
"set dp.projectid = ? where dp.payid= ?";
try {
PreparedStatement pset_f = conn.prepareStatement(sql);
pset_f.setString(1,inds[j]);
pset_f.setString(2,id);
pset_f.executeUpdate(sql_update);
}catch(Exception e){
//e.printStackTrace();
logger.error(e.message());
}閭d負浠涔堝畠榪欐牱澶勭悊灝辮兘棰勯槻SQL娉ㄥ叆鎻愰珮瀹夊叏鎬у憿錛熷叾瀹炴槸鍥犱負SQL璇鍙ュ湪紼嬪簭榪愯屽墠宸茬粡榪涜屼簡棰勭紪璇戱紝鍦ㄧ▼搴忚繍琛屾椂絎涓嬈℃搷浣滄暟鎹搴撲箣鍓嶏紝SQL璇鍙ュ凡緇忚鏁版嵁搴撳垎鏋愶紝緙栬瘧鍜屼紭鍖栵紝瀵瑰簲鐨勬墽琛岃″垝涔熶細緙撳瓨涓嬫潵騫跺厑璁告暟鎹搴撲互鍙傛暟鍖栫殑褰㈠紡榪涜屾煡璇錛屽綋榪愯屾椂鍔ㄦ佸湴鎶婂弬鏁頒紶緇橮reprareStatement鏃訛紝鍗充嬌鍙傛暟閲屾湁鏁忔劅瀛楃﹀ or '1=1'涔熸暟鎹搴撲細浣滀負涓涓鍙傛暟涓涓瀛楁電殑灞炴у兼潵澶勭悊鑰屼笉浼氫綔涓轟竴涓猄QL鎸囦護錛屽傛わ紝灝辮搗鍒頒簡SQL娉ㄥ叆鐨勪綔鐢ㄤ簡錛
⑥ java中preparedstatement為什麼可以防止sql注入
不知道樓主用沒有用過
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd換成 [' or '1' = '1] 這樣就可以完成sql注入
更有可能對你的資料庫表drop操作
如果使用preparedstatement的話就可以直接使用預編譯,PreparedStatement不允許在插入時改變查詢的邏輯結構.
舉例
statement
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
passwd就可以換成 『 or '1'='1
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
preparedstatement
select * from tab_name where name=? and passwd=? ;
PreparedStatement pst = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, passwd);
ResultSet rs = pstmt.executeQuery();