Java DNS 缓存查看器

标签 java networking dns

有没有办法查看/转储 java.net api 使用的 DNS 缓存?

最佳答案

这是一个打印正负 DNS 地址缓存的脚本。

import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class DNSCache {
  public static void main(String[] args) throws Exception {
    InetAddress.getByName("stackoverflow.com");
    InetAddress.getByName("www.google.com");
    InetAddress.getByName("www.yahoo.com");
    InetAddress.getByName("www.example.com");
    try {
        InetAddress.getByName("nowhere.example.com");
    } catch (UnknownHostException e) {

    }

    String addressCache = "addressCache";
    System.out.println(addressCache);
    printDNSCache(addressCache);
    String negativeCache = "negativeCache";
    System.out.println(negativeCache);
    printDNSCache(negativeCache);
  }
  private static void printDNSCache(String cacheName) throws Exception {
    Class<InetAddress> klass = InetAddress.class;
    Field acf = klass.getDeclaredField(cacheName);
    acf.setAccessible(true);
    Object addressCache = acf.get(null);
    Class cacheKlass = addressCache.getClass();
    Field cf = cacheKlass.getDeclaredField("cache");
    cf.setAccessible(true);
    Map<String, Object> cache = (Map<String, Object>) cf.get(addressCache);
    for (Map.Entry<String, Object> hi : cache.entrySet()) {
        Object cacheEntry = hi.getValue();
        Class cacheEntryKlass = cacheEntry.getClass();
        Field expf = cacheEntryKlass.getDeclaredField("expiration");
        expf.setAccessible(true);
        long expires = (Long) expf.get(cacheEntry);

        Field af = cacheEntryKlass.getDeclaredField("address");
        af.setAccessible(true);
        InetAddress[] addresses = (InetAddress[]) af.get(cacheEntry);
        List<String> ads = new ArrayList<String>(addresses.length);
        for (InetAddress address : addresses) {
            ads.add(address.getHostAddress());
        }

        System.out.println(hi.getKey() + " "+new Date(expires) +" " +ads);
    }
  }
}

关于Java DNS 缓存查看器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1835421/

相关文章:

java - 基于 SortedSet 中的 compareTo() 进行排序

java - 相同的条件逻辑为 Java 中的 AtomicBoolean 生成两个截然不同的字节码。为什么?

java - 根据 XMLGregorianCalendar 类型的键对 map 进行排序

c++ - 游戏协议(protocol)

ruby - Vagrant:在 private_network 中设置 VM 的 MAC 地址(hostonly)

ruby-on-rails - REST 中的客户端服务器 API 模式(不可靠的网络用例)

dns - Kestrel 是否支持 urls/hostnames,或者它只能监听一个端口?

java - 在将元素添加到集合之前声明迭代器

url - 在 Jenkins 中自定义 URL

linux - 使用容器名称从主机操作系统解析 docker 容器 IP