2012-08-08 25 views
0

我使用的方法水溼新的值設置爲私有靜態最終地圖

static void setFinalStatic(Field field, Object newValue) throws Exception 
    { 
     field.setAccessible(true); 

     final Field modifiersField = Field.class.getDeclaredField("modifiers"); 
     modifiersField.setAccessible(true); 
     modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

     field.set(null, newValue); 
    } 

改變private static final領域。
但是,如果字段的類型Map我得到異常

Exception in thread "main" java.lang.IllegalAccessException: Can not set static final java.util.Map field org.hibernate.type.TypeFactory.BASIC_TYPES to java.util.HashMap 
    at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:55) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:59) 
    at sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl.set(UnsafeQualifiedStaticObjectFieldAccessorImpl.java:59) 
    at java.lang.reflect.Field.set(Field.java:657) 
    at com.company.tester.Main.setFinalStatic(Main.java:64) 

什麼想法?

更多的代碼

Field types = TypeFactory.class.getDeclaredField("BASIC_TYPES"); 
    types.setAccessible(true); 
    Map val = (Map) types.get(null); 
    Map newMap = new HashMap(val); 
    newMap.put(String.class.getName(), new MyType()); 
    setFinalStatic(TypeFactory.class.getDeclaredField("BASIC_TYPES"), new HashMap()); 
+3

爲什麼你想這樣做?聽起來很討厭我。 – 2012-08-08 12:40:53

+0

使用standart hibernate API我不能做我想要的 – Ilya 2012-08-08 12:43:35

回答

3

field.setAccessible(true)輪流爲現場所有的安全檢查。改變其明顯的修飾符將無濟於事。還有其他的東西阻止了它的工作。

而不是試圖取代地圖,我會嘗試更新它。

Field types = TypeFactory.class.getDeclaredField("BASIC_TYPES"); 
types.setAccessible(true); 
Object bt = types.get(null); 
Field m = bt.getClass().getDeclaredField("m"); 
m.setAccessible(true); 
Map val = (Map) m.get(bt); 
val.put(String.class.getName(), new MyType()); 
+0

它的集合#不可修改地圖():-( – Ilya 2012-08-08 12:49:36

+0

我相信這是一個很好的理由;) – 2012-08-08 12:55:08

+0

已更新我的答案以獲取底層地圖。 – 2012-08-08 12:56:39