Das Beispiel in diesem Artikel beschreibt die Methode zum Bereinigen des DNS-Cache in Java. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
1. Testumgebung
Betriebssystem: Windows7 x64
JDK: 1.6.0_45
2. Ich habe vier Möglichkeiten gefunden, den DNS-Cache von JVM zu löschen. Sie können entsprechend Ihrer eigenen Situation wählen.
1. Bevor Sie InetAddress.getByName() zum ersten Mal aufrufen, legen Sie java.security.Security.setProperty("networkaddress.cache.ttl", "0"); fest.
2. Ändern Sie die Eigenschaft networkaddress.cache.ttl unter jre/lib/security/java.security
3. Legen Sie -Dsun.net.inetaddr.ttl=0 in den JVM-Startparametern fest
4. Bereinigen durch Reflexion, wie zum Beispiel die ClearCache-Methode in diesem Artikel
3. Code
Kopieren Sie den Code wie folgt: package xiaofei;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.UnknownHostException;
java.util.Map importieren;
/**
* @Autor xiaofei.wxf
* @Datum 13.12.18
*/
öffentliche Klasse DNSCacheTest {
/**
* 1. Bevor Sie InetAddress.getByName() zum ersten Mal aufrufen, legen Sie java.security.Security.setProperty("networkaddress.cache.ttl", "0"); fest.
* 2. Ändern Sie die Eigenschaft networkaddress.cache.ttl unter jre/lib/security/java.security
* 3. Legen Sie -Dsun.net.inetaddr.ttl=0 in den JVM-Startparametern fest
* 4. Rufen Sie zum Löschen die Methode „clearCache“ auf
*
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) löst UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//clearCache();
//Setze einen Haltepunkt in der nächsten Zeile.
//Es ist ungültig, es hier einzugeben, da dieser Wert beim Laden der Klasse bestimmt wird (er sollte vor der Verwendung von InetAddress.getByName festgelegt werden) und zwischengespeichert wurde.
//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() löst NoSuchFieldException, IllegalAccessException {
//Mit der Änderung der Cache-Daten beginnen
Classclazz = java.net.InetAddress.class;
final Field cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(true);
final Object obj = cacheField.get(clazz);
Klasse CacheClazz = obj.getClass();
letztes Feld CachePolicyField = CacheClazz.getDeclaredField("Typ");
letztes Feld CacheMapField = CacheClazz.getDeclaredField("Cache");
cachePolicyField.setAccessible(true);
cacheMapField.setAccessible(true);
final Map cacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
Ich hoffe, dass dieser Artikel für die Java-Programmierung aller hilfreich sein wird.