L'exemple de cet article décrit la méthode de nettoyage du cache DNS en Java. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
1. Environnement de test
Système d'exploitation : Windows7 x64
JDK : 1.6.0_45
2. J'ai trouvé quatre façons de vider le cache DNS de jvm. Vous pouvez choisir en fonction de votre propre situation.
1. Avant d'appeler InetAddress.getByName() pour la première fois, définissez java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. Modifiez la propriété networkaddress.cache.ttl sous jre/lib/security/java.security
3. Définissez -Dsun.net.inetaddr.ttl=0 dans les paramètres de démarrage jvm
4. Nettoyage par réflexion, comme la méthode clearCache dans cet article
3. Coder
Copiez le code comme suit : package xiaofei ;
importer java.lang.reflect.Field ;
importer java.net.InetAddress ;
importer java.net.UnknownHostException ;
importer java.util.Map ;
/**
* @auteur xiaofei.wxf
* @date 13-12-18
*/
classe publique DNSCacheTest {
/**
* 1. Avant d'appeler InetAddress.getByName() pour la première fois, définissez java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. Modifiez la propriété networkaddress.cache.ttl sous jre/lib/security/java.security
* 3. Définissez -Dsun.net.inetaddr.ttl=0 dans les paramètres de démarrage jvm
* 4. Appelez la méthode clearCache pour effacer
*
* @param arguments
* @throws UnknownHostException
*/
public static void main (String[] args) lance UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("adresse réseau.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//clearCache();
//Définit un point d'arrêt sur la ligne suivante.
//Il n'est pas valide de la mettre ici, car cette valeur est déterminée lors du chargement de la classe (elle doit être définie avant d'utiliser InetAddress.getByName) et a été mise en cache.
//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());
//clearCache();
}
public static void clearCache() lance NoSuchFieldException, IllegalAccessException {
// Commencer à modifier les données du cache
Classclazz = java.net.InetAddress.class;
champ final cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(true);
Objet final obj = cacheField.get(clazz);
Classe cacheClazz = obj.getClass();
Champ final cachePolicyField = cacheClazz.getDeclaredField("type");
Champ final cacheMapField = cacheClazz.getDeclaredField("cache");
cachePolicyField.setAccessible(true);
cacheMapField.setAccessible(true);
Carte finale cacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
J'espère que cet article sera utile à la programmation Java de chacun.