В примере в этой статье описан метод очистки DNS-кеша в Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
1. Тестовая среда
ОС: Windows7 x64
JDK: 1.6.0_45
2. Я нашел четыре способа очистки DNS-кэша jvm. Вы можете выбирать в зависимости от вашей ситуации.
1. Перед первым вызовом InetAddress.getByName() установите java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. Измените свойство networkaddress.cache.ttl в jre/lib/security/java.security.
3. Установите -Dsun.net.inetaddr.ttl=0 в параметрах запуска jvm.
4. Очистка посредством отражения, например метод ClearCache в этой статье.
3. Код
Скопируйте код следующим образом: package xiaofei;
импортировать java.lang.reflect.Field;
импортировать java.net.InetAddress;
импортировать java.net.UnknownHostException;
импортировать java.util.Map;
/**
* @author xiaofei.wxf
* @дата 13-12-18
*/
общественный класс DNSCacheTest {
/**
* 1. Перед первым вызовом InetAddress.getByName() установите java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. Измените свойство networkaddress.cache.ttl в jre/lib/security/java.security.
* 3. Установите -Dsun.net.inetaddr.ttl=0 в параметрах запуска jvm.
* 4. Вызовите метод ClearCache для очистки.
*
* @param аргументы
* @throws UnknownHostException
*/
public static void main(String[] args) выдает UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//очистить кэш();
//Устанавливаем точку останова на следующей строке.
//Недопустимо размещать его здесь, поскольку это значение определяется при загрузке класса (оно должно быть установлено перед использованием InetAddress.getByName) и кэшировано.
//java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr2 = InetAddress.getByName("www.baidu.com");
System.out.println(addr2.getHostAddress());
InetAddress addr3 = InetAddress.getByName("www.google.com");
System.out.println(addr3.getHostAddress());
InetAddress addr4 = InetAddress.getByName("www.google.com");
System.out.println(addr4.getHostAddress());
//очистить кэш();
}
public static void ClearCache() выдает NoSuchFieldException, IllegalAccessException {
//Начинаем изменять данные кэша
Classclazz = java.net.InetAddress.class;
окончательное поле cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(истина);
конечный объект obj = cacheField.get(clazz);
Класс cacheClazz = obj.getClass();
окончательное поле cachePolicyField = cacheClazz.getDeclaredField("type");
окончательное поле cacheMapField = cacheClazz.getDeclaredField("кэш");
cachePolicyField.setAccessible(истина);
кэшMapField.setAccessible(истина);
окончательная карта cacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.