Contoh dalam artikel ini menjelaskan metode pembersihan Cache DNS di Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
1. Lingkungan pengujian
OS: Windows7x64
JDK: 1.6.0_45
2. Saya menemukan empat cara untuk menghapus cache DNS jvm. Anda dapat memilih sesuai dengan situasi Anda sendiri.
1. Sebelum memanggil InetAddress.getByName() untuk pertama kali, setel java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. Ubah properti networkaddress.cache.ttl di bawah jre/lib/security/java.security
3. Setel -Dsun.net.inetaddr.ttl=0 di parameter startup jvm
4. Membersihkan melalui refleksi, seperti metode clearCache pada artikel ini
3. Kode
Salin kode sebagai berikut: paket xiaofei;
import java.lang.reflect.Field;
impor java.net.InetAddress;
impor java.net.UnknownHostException;
import java.util.Map;
/**
* @penulis xiaofei.wxf
* @tanggal 13-12-18
*/
Tes DNSCache kelas publik {
/**
* 1. Sebelum memanggil InetAddress.getByName() untuk pertama kali, setel java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. Ubah properti networkaddress.cache.ttl di bawah jre/lib/security/java.security
* 3. Setel -Dsun.net.inetaddr.ttl=0 dalam parameter startup jvm
* 4. Panggil metode clearCache untuk menghapus
*
* @param argumen
* @melempar UnknownHostException
*/
public static void main(String[] args) melempar UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.keamanan.Keamanan.setProperty("alamat jaringan.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
Sistem.keluar.println(addr1.getHostAddress());
//hapusCache();
//Tetapkan breakpoint pada baris berikutnya.
//Tidak valid untuk meletakkannya di sini, karena nilai ini ditentukan ketika kelas dimuat (harus disetel sebelum menggunakan InetAddress.getByName) dan telah di-cache.
//java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr2 = InetAddress.getByName("www.baidu.com");
Sistem.keluar.println(addr2.getHostAddress());
InetAddress addr3 = InetAddress.getByName("www.google.com");
Sistem.keluar.println(addr3.getHostAddress());
InetAddress addr4 = InetAddress.getByName("www.google.com");
Sistem.keluar.println(addr4.getHostAddress());
//hapusCache();
}
public static void clearCache() melempar NoSuchFieldException, IllegalAccessException {
//Mulai memodifikasi data cache
Classclazz = java.net.InetAddress.kelas;
bidang terakhir cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(benar);
objek akhir objek = cacheField.get(clazz);
Kelas cacheClazz = obj.getClass();
Bidang terakhir cachePolicyField = cacheClazz.getDeclaredField("type");
Bidang terakhir cacheMapField = cacheClazz.getDeclaredField("cache");
cachePolicyField.setAccessible(benar);
cacheMapField.setAccessible(benar);
final Peta cacheMap = (Peta)cacheMapField.get(obj);
Sistem.keluar.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.