ตัวอย่างในบทความนี้อธิบายวิธีการล้าง DNS Cache ใน Java แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
1. สภาพแวดล้อมการทดสอบ
ระบบปฏิบัติการ: Windows7 x64
เจดีเค: 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. รหัส
คัดลอกรหัสดังต่อไปนี้: แพคเกจ xiaofei;
นำเข้า java.lang.reflect.Field;
นำเข้า java.net.InetAddress;
นำเข้า java.net.UnknownHostException;
นำเข้า java.util.Map;
-
* @ผู้เขียน xiaofei.wxf
* @วันที่ 13-12-61
-
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 args
* @พ่น UnknownHostException
-
โมฆะคงที่สาธารณะ 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());
//clearCache();
//กำหนดจุดพักในบรรทัดถัดไป
//การใส่ไว้ที่นี่ไม่ถูกต้อง เนื่องจากค่านี้ถูกกำหนดเมื่อมีการโหลดคลาส (ควรตั้งค่าก่อนใช้ 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());
//clearCache();
-
โมฆะคงที่สาธารณะ clearCache () พ่น NoSuchFieldException, IllegalAccessException {
//เริ่มแก้ไขข้อมูลแคช
Classclazz = java.net.InetAddress.class;
ฟิลด์สุดท้าย cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible (จริง);
วัตถุสุดท้าย obj = cacheField.get (clazz);
คลาส cacheClazz = obj.getClass();
ฟิลด์สุดท้าย cachePolicyField = cacheClazz.getDeclaredField ("ประเภท");
ฟิลด์สุดท้าย cacheMapField = cacheClazz.getDeclaredField ("แคช");
cachePolicyField.setAccessible (จริง);
cacheMapField.setAccessible (จริง);
แผนที่สุดท้าย cacheMap = (แผนที่) cacheMapField.get (obj);
System.out.println(แผนที่แคช);
cacheMap.remove("www.baidu.com");
-
-
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน