java dns 缓存_java实现清理DNS Cache的方法

本文详细介绍了在Java环境中如何清理DNS缓存,包括四种方法:1. 设置Security属性;2. 修改`java.security`配置文件;3. 通过JVM启动参数设置;4. 使用反射调用`clearCache`方法。代码示例展示了具体操作过程,有助于理解Java中DNS缓存的管理。
摘要由CSDN通过智能技术生成

本文实例讲述了java实现清理DNS Cache的方法。分享给大家供大家参考。具体分析如下:

一、测试环境

OS:Windows7 x64

JDK:1.6.0_45

二、本人找到四种方式清理jvm的DNS缓存,大家可以根据自己的情况选用。

1. 在首次调用InetAddress.getByName()前,设置java.security.Security.setProperty("networkaddress.cache.ttl", "0");

2. 修改jre/lib/security/java.security 下的 networkaddress.cache.ttl 属性

3. jvm启动参数中设置-Dsun.net.inetaddr.ttl=0

4. 通过反射清理,如本文的clearCache方法

三、代码

package xiaofei;

import java.lang.reflect.Field;

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.util.Map;

/**

* @author xiaofei.wxf

* @date 13-12-18

*/

public class DNSCacheTest {

/**

* 1. 在首次调用InetAddress.getByName()前,设置java.security.Security.setProperty("networkaddress.cache.ttl", "0");

* 2. 修改jre/lib/security/java.security 下的 networkaddress.cache.ttl 属性

* 3. jvm启动参数中设置-Dsun.net.inetaddr.ttl=0

* 4. 调用clearCache方法清除

*

* @param args

* @throws UnknownHostException

*/

public static void main(String[] args) throws 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之前设置)已经缓存了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() throws NoSuchFieldException, IllegalAccessException {

//修改缓存数据开始

Class clazz = java.net.InetAddress.class;

final Field cacheField = clazz.getDeclaredField("addressCache");

cacheField.setAccessible(true);

final Object obj = cacheField.get(clazz);

Class cacheClazz = obj.getClass();

final Field cachePolicyField = cacheClazz.getDeclaredField("type");

final Field 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");

}

}

希望本文所述对大家的Java程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值