El ejemplo de este artículo describe el método de limpieza de la caché de DNS en Java. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
1. Entorno de prueba
Sistema operativo: Windows7 x64
JDK: 1.6.0_45
2. Encontré cuatro formas de borrar el caché DNS de jvm. Puede elegir según su propia situación.
1. Antes de llamar a InetAddress.getByName() por primera vez, configure java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. Modifique la propiedad networkaddress.cache.ttl en jre/lib/security/java.security
3. Establezca -Dsun.net.inetaddr.ttl=0 en los parámetros de inicio de jvm
4. Limpieza mediante reflexión, como el método clearCache de este artículo.
3. Código
Copie el código de la siguiente manera: paquete xiaofei;
importar java.lang.reflect.Field;
importar java.net.InetAddress;
importar java.net.UnknownHostException;
importar java.util.Map;
/**
* @autor xiaofei.wxf
*@fecha 13-12-18
*/
prueba DNSCache de clase pública {
/**
* 1. Antes de llamar a InetAddress.getByName() por primera vez, configure java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. Modifique la propiedad networkaddress.cache.ttl en jre/lib/security/java.security
* 3. Establezca -Dsun.net.inetaddr.ttl=0 en los parámetros de inicio de jvm
* 4. Llame al método clearCache para borrar
*
* argumentos @param
* @throws UnknownHostException
*/
public static void main (String[] args) lanza UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//borrarCache();
//Establece un punto de interrupción en la siguiente línea.
// No es válido ponerlo aquí, porque este valor se determina cuando se carga la clase (debe configurarse antes de usar InetAddress.getByName) y se ha almacenado en caché.
//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());
//borrarCache();
}
clearCache vacío estático público () lanza NoSuchFieldException, IllegalAccessException {
//Comenzar a modificar los datos de la caché
Classclazz = java.net.InetAddress.class;
campo final cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(verdadero);
Objeto final obj = cacheField.get(clazz);
Clase cacheClazz = obj.getClass();
campo final cachePolicyField = cacheClazz.getDeclaredField("tipo");
campo final cacheMapField = cacheClazz.getDeclaredField("caché");
cachePolicyField.setAccessible(verdadero);
cacheMapField.setAccessible(verdadero);
mapa final cacheMap = (Mapa)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
Espero que este artículo sea útil para la programación Java de todos.