2012-12-07 22 views
5

Tôi muốn đặt "NO_CACHE" thành newValue. Đây là mã của tôi:Trường tĩnh cuối cùng thay đổi Android sử dụng Java Reflection?

static void setFinalStatic(Object newValue) throws Exception 
{ 
    Field field = CacheManager.class.getDeclaredField("NO_CACHE"); 
    field.setAccessible(true); 
    Field modifiersField=Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field,field.getModifiers() & ~Modifier.FINAL); 
    field.set(null, newValue); 
} 

Nhưng chạy mã này trên Android tạo ra các lỗi sau:

java.lang.NoSuchFieldException: modifiers 

tôi thấy modifiers là một lĩnh vực trong lớp Field trong Java, nhưng nó không phải là một lĩnh vực trong lớp học Field trên Android.

Đây là mã Java Field lớp:

http://www.docjar.com/html/api/java/lang/reflect/Field.java.html

Đây là Android đang Field lớp:

http://www.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java

Đoạn mã trên trong Java có thể làm việc, nhưng nó không hoạt động trên nền tảng Android.

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

+0

'CacheManager' là gì? –

+0

android.webkit.CacheManager – user1884025

+0

Cách này hoạt động bên ngoài Android, nếu đó là lớp chỉ dành cho Android? –

Trả lời

2

Android thực sự không sử dụng mã nguồn JDK. Đó là một cái gì đó rất giống nhau nhưng không giống nhau.

Trong Java, công cụ sửa đổi thuộc loại java.lang.reflection.Field, nhưng trong Android không có loại như vậy. Android đã triển khai một hệ thống sử dụng số nguyên và tên của trường để xác thực các biến tố của nó bằng cách gọi phương thức gốc.

Tôi nghĩ trường private static final sẽ có slot -1 và trường riêng tư sẽ có giá trị 3. Nếu bạn muốn thay đổi trường private static final, chỉ cần thay đổi slot thành 3 trước khi đặt giá trị.

Field booleanField = Boolean.class.getField("FALSE"); 
booleanField.setAccessible(true); 

Field slotField = Field.class.getDeclaredField("slot"); 
slotField.setAccessible(true); 
slotField.set(booleanField, 3); 

booleanField.set(Boolean.FALSE, true); 
+1

Trường trong Android được gọi là 'accessFlags' không phải là' slot' và không phải 'các biến tố' – for3st

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