Để truy cập các trường riêng tư, bạn cần lấy chúng từ các trường được khai báo của lớp và sau đó làm cho chúng có thể truy cập được:
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException
EDIT : như đã được nhận xét bởi aperkins , cả hai truy cập vào trường, đặt nó là có thể truy cập và truy xuất giá trị có thể ném Exception
s, mặc dù các trường hợp ngoại lệ được kiểm tra duy nhất bạn cần lưu ý được nhận xét ở trên.
Các NoSuchFieldException
sẽ được ném nếu bạn yêu cầu một lĩnh vực bởi một tên mà không tương ứng với một lĩnh vực khai báo.
obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException
Các IllegalAccessException
sẽ được ném nếu lĩnh vực này là không thể truy cập (ví dụ, nếu nó là tư nhân và đã không được thực hiện truy cập thông qua bỏ lỡ các f.setAccessible(true)
dòng.
Các RuntimeException
s có thể bị ném là SecurityException
s (nếu JVM SecurityManager
sẽ không cho phép bạn thay đổi khả năng truy cập của một trường) hoặc IllegalArgumentException
s, nếu bạn thử và truy cập vào trường trên một đối tượng không thuộc loại của trường:
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type