2014-12-03 64 views
1

test()方法爲public時,此程序運行良好,但只要我將其修改器更改爲private它顯示運行時錯誤。是否有人可以解釋爲什麼?反射API中的方法類

package ObjectClass; 
import java.lang.reflect.Method; 

public class reflect8 { 

     public static void main(String[] args) throws Exception { 

      Class c1 = Class.forName("ObjectClass.Reflect8A"); 

      Object obj = c1.newInstance(); 

      Method m1 = c1.getDeclaredMethod("test"); 

      m1.invoke(obj); 

    } 
} 

class Reflect8A { 

     private void test() { 

      System.out.println("from test..."); 
     } 
    } 
+0

也http://stackoverflow.com/questions/19135218/invoke-private-method-with-java-lang-invoke-methodhandle – Raedwald 2014-12-03 13:48:06

+0

見那還用說嘛。你知道「私人」是什麼意思嗎? – Raedwald 2014-12-03 13:57:12

回答

3

這就是爲什麼你需要調用setAccessible(true)即使getDeclaredMethod回報的私有方法。

Javadoc of getDeclaredMethod(重點煤礦):

返回包含反映此Class對象表示的類或接口的所有聲明的方法,包括公共,保護,默認(包)的方法的對象的陣列訪問,私有方法,但不包括繼承方法。

Javadoc of invoke

拋出IllegalAccessException - 如果此Method對象是強制執行Java語言訪問控制和基本方法不可訪問。

Javadoc of setAccessible(重點煤礦):

設置accessible標誌該對象指示的布爾值。 值爲true表示反射對象在使用時應禁止Java語言訪問檢查。

3
Method m1 = c1.getDeclaredMethod("test"); 
m1.setAccessible(true); 
m1.invoke(obj); 
+0

@ Tkachur_evgen,它工作,但因爲我們在運行時獲得一個類的實例,爲什麼我們不能通過該實例訪問私有方法,而不調用setAccessible(true) – Aamir 2014-12-03 11:35:44

+0

@Aamir,因爲私有修飾符指定只能訪問成員在其自己的班級 – 2014-12-03 11:40:08