在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet4Address与Inet6Address的异同, 可以看成一个Facade工具类.

  1. A Low Level API, which deals with the following abstractions:
  2. Addresses, which are networking identifiers, like IP addresses.
  3. Sockets, which are basic bidirectional data communication mechanisms.
  4. Interfaces, which describe network interfaces.

复制代码

在OpenJDK的InetAddress源码中, 根据dns或hostname解析IP的代码部分:

  1. private static InetAddress[] getAllByName0 (String host, InetAddress reqAddr, boolean check)
  2. throws UnknownHostException  {
  3. /* If it gets here it is presumed to be a hostname */
  4. /* Cache.get can return: null, unknownAddress, or InetAddress[] */
  5. /* make sure the connection to the host is allowed, before we
  6. * give out a hostname
  7. */
  8. if (check) {
  9. SecurityManager security = System.getSecurityManager();
  10. if (security != null) {
  11. security.checkConnect(host, -1);
  12. }
  13. }
  14. InetAddress[] addresses = getCachedAddresses(host);
  15. /* If no entry in cache, then do the host lookup */
  16. if (addresses == null) {
  17. addresses = getAddressesFromNameService(host, reqAddr);
  18. }
  19. if (addresses == unknown_array)
  20. throw new UnknownHostException(host);
  21. return addresses.clone();
  22. }

复制代码

关键的二个方法是:
getCachedAddresses(host);
getAddressesFromNameService(host, reqAddr);
前者从addressCache, 或negativeCache根据dns/hostname解析缓存的IP.
后者从遍历nameServices,调用每个NameService的lookupAllHostAddr(host)查找IP, 然后将host:IP缓存到前面的cache中.
根据上述, 实现动态解析DNS, 有二种方式:
1. 反射addressCache, 或negativeCache, 将host:IP通过Cache的put()方法放入.
2. 反射nameServices,将代理的NameService实例放入.
二种做法的难处:
1. addressCache, 或negativeCache都是 java.net.InetAddress.Cache, 其内部的CacheEntry受二组JVM选项影响:
networkaddress.cache.ttl
networkaddress.cache.negative.ttl
在ttl后, CacheEntry的get()只会返回null.
2. nameServices只是OpenJDK的实现. 换言之,只是SUN一家的. 其他JDK不用此属性名.
写段代码看看Jrockit与IBM JVM中InetAddress内部的属性:

  1. Class<InetAddress> type = InetAddress.class;
  2. Field[] fields = type.getDeclaredFields();
  3. for (Field f : fields) {
  4. System.out.println(f.getName() + ":" + f.getType());
  5. }

复制代码

OpenJDK:

  1. IPv4
  2. IPv6
  3. preferIPv6Address
  4. holder
  5. nameServices
  6. canonicalHostName
  7. serialVersionUID
  8. addressCache
  9. negativeCache
  10. addressCacheInit
  11. unknown_array
  12. impl
  13. lookupTable
  14. cachedLocalHost
  15. cacheTime
  16. maxCacheTime
  17. cacheLock
  18. FIELDS_OFFSET
  19. UNSAFE
  20. serialPersistentFields
  21. $assertionsDisabled

复制代码

JRockit:

  1. IPv4
  2. IPv6
  3. preferIPv6Address
  4. hostName
  5. address
  6. family
  7. nameService
  8. canonicalHostName
  9. serialVersionUID
  10. addressCache
  11. negativeCache
  12. addressCacheInit
  13. unknown_array
  14. impl
  15. lookupTable
  16. $assertionsDisabled

复制代码

IBM JDK

  1. IPv4:int
  2. IPv6:int
  3. preferIPv6Address
  4. hostName:class java.lang.String
  5. address:int
  6. family:int
  7. nameService:interface sun.net.spi.nameservice.NameService
  8. canonicalHostName:class java.lang.String
  9. serialVersionUID:long
  10. addressCache:class java.net.InetAddress$Cache
  11. negativeCache:class java.net.InetAddress$Cache
  12. localHostName:class java.lang.String
  13. localHostNameLock:class java.lang.Object
  14. cacheLocalHost:boolean
  15. addressCacheInit:boolean
  16. unknown_array:class [Ljava.net.InetAddress;
  17. impl:interface java.net.InetAddressImpl
  18. lookupTable:class java.util.HashMap
  19. $assertionsDisabled:boolean

复制代码

看到这里, 知道蛋疼了吧. 三种JDK中,
OpenJDK中是nameservices是个List<NameService>,
Jrockit与IBM JVM中却是nameservice, 只是单独的NameService实例.
所以要用第2种做法, 你至少要满足这三种主流JDK的需求.
简单实现二种做法:
做法1, 动态替换AddressCache.
做法2, 动态代理NameService.
源码如下

  1. 长度限制, 源码查看回贴.

复制代码

暂时测试到这吧, 有兴趣的同学可以一起完善. 争取同时满足OpenJDK, Jrockit, IBM JDK三种主流环境的DNS动态解析类.

Java动态替换InetAddress中DNS的做法简单分析1的更多相关文章

  1. Java动态替换InetAddress中DNS的做法简单分析2

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  2. java itext替换PDF中的文本

    itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...

  3. Java动态代理——框架中的应用场景和基本原理

    前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...

  4. MessageFormat的用法,java动态替换String字符串中的占位符

    import java.text.MessageFormat; import java.util.GregorianCalendar; import java.util.Locale; public ...

  5. 【Android】通过Java代码替换TabHost中的drawableTop资源

    在博客 http://blog.csdn.net/jueblog/article/details/11837445 中的Tab选项卡中, 点击相应的Tab选项,图标没有发生改变. 这些资源图片也没有尽 ...

  6. Java动态调用类中方法

    在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...

  7. Java 动态向 JTable 中添加数据

    import java.awt.Toolkit; import javax.swing.SwingUtilities; import javax.swing.UIManager; import jav ...

  8. java.util.ComparableTimSort中的sort()方法简单分析

    TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...

  9. java获取properties配置文件中某个属性最简单方法

    假如我想获取src目录下sysConfig.properties中的uploadpath属性的值 方法如下所示: private static final ResourceBundle bundle ...

随机推荐

  1. Windows7下安装IIS出现“出现错误,并非所有的功能被成功更改

    1.开始,搜索输入UAC-->选择 “更改用户账户控制设置” 2.调到最低 3.打开控制面板-->程序-->打开或关闭windows功能,去掉图里的2个选项,点确定,重启 4.重启后 ...

  2. 旅行计划-DAG上最长路

    http://www.luogu.org/problem/show?pid=1137 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发 ...

  3. CODEVS 1001 舒适的路线

    思路:先按照速度大小对边排序,再枚举最终路径中的速度最大值,并查集,更新答案 #include<iostream> #include<vector> #include<a ...

  4. javascript设计模式-桥接模式

    在系统中,某些类由于自身逻辑,具有两个或两个以上维度的变化,如何使得该类型可以沿多个方向变化,但又不引入额外的复杂度,这就是桥接模式要解决的问题. 定义:桥接模式(Bridge),将抽象部分与它的实现 ...

  5. [Nginx 1] Nginx简介

    导读:现在项目中用到这个Nginx了,本来是想着把代码调通了就得了.想想还是花点时间总结总结,就利用门卫思维吧.今天主要是一个整体的介绍,然后在学习的过程中,接着总结Nginx的其他使用事宜. 一.什 ...

  6. Heavily reliance on forensic tools is risky

    We could take advantage of forensic tools to examine and analyze the evidence, but heavily reliance ...

  7. 理解CSS中BFC

    BFC(Block Formatting Context) 是Web页面中盒模型布局的CSS渲染模式.它的定位体系 属于 常规文档流 .摘自 W3C : 浮动,绝对定位元素, inline-block ...

  8. Aspose.cell.dll的使用,导excel表

    using System; using System.Web; using EF; using Newtonsoft.Json; using System.Collections.Generic; u ...

  9. jquery.qrcode.js生成二维码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 软件工程 speedsnail 第二次冲刺2

    20150519 完成任务:划线第二天,能画出一条直黄线: 遇到问题: 问题1 划线的代码和移动的setcontentview冲突,无法同时显示 解决1 没有解决 明日任务: 线与移动共存