天天看點

Java筆記

  • 對線程異常的處理
  • 遠端調試
  • 修改static final變量
  • execute、executeUpdate、executeQuery三者的差別(及傳回值)

調用Thread的靜态方法Thread.setDefaultUncaughtExceptionHandler()

Java遠端調試的原理是兩個VM之間通過debug協定進行通信,然後以達到遠端調試的目的。兩者之間可以通過socket進行通信。

首先被debug程式的虛拟機在啟動時要開啟debug模式,啟動debug監聽程式。jdwp是Java Debug Wire Protocol的縮寫。

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n zhc_application

這是jdk1.7版本之前的方法,1.7之後可以這樣用:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8880 -cp "./lib/*:./classes" com.zte.ums.cnms.model.manager.service.XXX server config.yml

zhc_application是main程式,server=y表示是監聽其他debugclient端的請求。address=8000表示端口是8000

suspend表示是否在調試用戶端建立連接配接之後啟動 VM。如果為y,那麼目前的VM就是suspend直到有debug client連接配接進來才開始執行程式。如果你的程式不是伺服器監聽模式并且很快就執行完畢的,那麼可以選擇在y來阻塞它的啟動。

然後用一個debug用戶端去debug遠端的程式了,比如用Eclipse自帶的debug用戶端,填寫運作被debug程式的虛拟機監聽的端口号和位址,選擇connect方式為attach

//擷取Bean類的INT_VALUE字段  
Field field = Bean.class.getField("INT_VALUE");  
//将字段的通路權限設為true:即去除private修飾符的影響  
field.setAccessible(true);  
/*去除final修飾符的影響,将字段設為可修改的*/  
Field modifiersField = Field.class.getDeclaredField("modifiers");  
modifiersField.setAccessible(true);  
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);  
//把字段值設為200  
field.set(null, 200);  
           

局限性:基本類型,修改不了=.=/

1. ResultSet executeQuery(String sql); 執行SQL查詢,并傳回ResultSet 對象。
2. int executeUpdate(String sql); 可執行增,删,改,傳回執行受到影響的行數。
3. boolean execute(String sql); 可執行任何SQL語句,傳回一個布爾值,表示是否傳回ResultSet 。

execute是executeQuery和executeUpdate的綜合.
executeUpdate() 這是 PreparedStatement 接口中的方法
executeUpdate(String sql) 這是 PreparedStatement 從父接口 Statement 中繼承過來的方法

           

I am a slow walker, but I never walk backwards.