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());
4

1 に答える 1

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());
于 2012-08-08T12:44:49.160 に答える