kaihou999の日記: java.util.ResourceBundle
日記 by
kaihou999
ちょっとした要求のために、ResourceBundleから利用している
.propatiesファイルをリロードしなければならなくなった。
reflectionを利用して以下のようなコードを作成したら、
ResourceBundleのインスタンス自体は、再生成されるようになったのだが…。
--------------------------------------------------------------------------
public static void deleteResourceBundleCache(String name){
try{
Class c = ResourceBundle.class;
Field f = c.getDeclaredField("cacheList");
f.setAccessible(true);
SoftCache map = (SoftCache)f.get(null);
List keys = getSearchKey(map, name);
for(int i = 0; i < keys.size(); i++){
map.remove(keys.get(i));
}
}catch(Throwable t){
t.printStackTrace();
}
}
private static List getSearchKey(SoftCache map, String name){
List delKey = new ArrayList();
for(Iterator i = map.keySet().iterator(); i.hasNext(); ){
Object key = i.next();
Class keyClass = key.getClass();
try{
Field keyField = keyClass.getDeclaredField("searchName");
keyField.setAccessible(true);
String keyValue = (String)keyField.get(key);
if(keyValue.indexOf(name) >= 0){
delKey.add(key);
}
}catch(IllegalAccessException e){
}catch(NoSuchFieldException e){
}
}
return delKey;
}
--------------------------------------------------------------------------
確かに再生成する…のだけど、キャッシュされたファイルにアクセス
しているらしく、結局再作成しないときと同じ動きになってしまった。
むむぅ。戦術が間違ってた臭いな(汗
.propatiesファイルをリロードしなければならなくなった。
reflectionを利用して以下のようなコードを作成したら、
ResourceBundleのインスタンス自体は、再生成されるようになったのだが…。
--------------------------------------------------------------------------
public static void deleteResourceBundleCache(String name){
try{
Class c = ResourceBundle.class;
Field f = c.getDeclaredField("cacheList");
f.setAccessible(true);
SoftCache map = (SoftCache)f.get(null);
List keys = getSearchKey(map, name);
for(int i = 0; i < keys.size(); i++){
map.remove(keys.get(i));
}
}catch(Throwable t){
t.printStackTrace();
}
}
private static List getSearchKey(SoftCache map, String name){
List delKey = new ArrayList();
for(Iterator i = map.keySet().iterator(); i.hasNext(); ){
Object key = i.next();
Class keyClass = key.getClass();
try{
Field keyField = keyClass.getDeclaredField("searchName");
keyField.setAccessible(true);
String keyValue = (String)keyField.get(key);
if(keyValue.indexOf(name) >= 0){
delKey.add(key);
}
}catch(IllegalAccessException e){
}catch(NoSuchFieldException e){
}
}
return delKey;
}
--------------------------------------------------------------------------
確かに再生成する…のだけど、キャッシュされたファイルにアクセス
しているらしく、結局再作成しないときと同じ動きになってしまった。
むむぅ。戦術が間違ってた臭いな(汗
java.util.ResourceBundle More ログイン