2012-06-25 31 views
16

Change private static final field using Java reflectionAndroid: thay đổi trường tĩnh riêng tư bằng cách sử dụng phản chiếu java

Tôi đã làm theo hướng dẫn trong liên kết ở trên để thay đổi trường tĩnh riêng tư bằng cách sử dụng phản chiếu java. Tôi có một đối tượng có tên là "dữ liệu". Bên trong "dữ liệu", có biến cố định tĩnh cuối cùng có tên "loại". Tôi muốn đặt "loại" thành rỗng. Đây là mã của tôi.

Field field = data.getClass().getDeclaredField("type"); 
field.setAccessible(true); 
Field modifiersField = Field.class.getDeclaredField("modifiers"); 
modifiersField.setAccessible(true); 
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
field.set(data, null); 

Tôi đã thử làm điều này trên Java 1.7 với mã tương tự và nó hoạt động. Nhưng chạy mã này trên Android tạo ra lỗi sau: java.lang.NoSuchFieldException: sửa đổi

Tôi đoán "công cụ sửa đổi" không phải là một trường trong lớp Field trên Android.

Làm cách nào để khắc phục sự cố này?

+0

Bạn ... không thể thay đổi _modifiers trên trường class_ tại _runtime._ –

+1

Tôi có thể theo liên kết đó. – jas7

+2

Hãy nhớ rằng trình biên dịch Java có thể có giá trị nội tuyến của các trường cuối cùng tĩnh nguyên thủy. Việc thực hiện phép thuật phản xạ này có thể dẫn đến hành vi kỳ quái. – millimoose

Trả lời

10

Tác phẩm này.

Field field = data.getClass().getDeclaredField("type"); 
field.setAccessible(true); 
field.set(data, null); 
+1

Điều này đã hiệu quả. Nhưng tại sao? ART có loại bỏ công cụ sửa đổi cuối cùng hay không đơn giản cho phép truy cập nó? –

+0

Điều này làm việc, vì đối tượng đầu tiên trong hàm 'field.set (...)' là đối tượng sửa đổi NOT trường dữ liệu – prom85

+0

không tĩnh trong trường hợp này? –

Các vấn đề liên quan