1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.Method;
  7. import java.net.HttpURLConnection;
  8. import java.net.InetAddress;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.net.UnknownHostException;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. import sun.net.spi.nameservice.NameService;
  16. public class JavaDNSCacheTest {
  17. /**
  18. * 经测试,二种方式在Windows环境都可以, Linux环境待测
  19. *
  20. * @param args
  21. * @throws Exception
  22. */
  23. public static void main(String[] args) throws Exception {
  24. /* 1. 动态替换AddressCache */
  25. // changeDNSWithAddressCache();
  26. /* 1. 动态代理NameService */
  27. changeDNSWithNameService();
  28. }
  29. public static void changeDNSWithNameService() throws Exception {
  30. /* 1. 获取反身类 */
  31. Class<?> addressClass = InetAddress.class;
  32. /* 2. 获取addressCache字段 */
  33. try {
  34. Field nameServiceField = addressClass.getDeclaredField("nameService");// 对于Jrockit或IBM JDK
  35. nameServiceField.setAccessible(true);
  36. sun.net.spi.nameservice.NameService nameService = (NameService) nameServiceField.get(null);
  37. nameServiceField.set(null, new NameServiceProxy(nameService));
  38. nameServiceField.setAccessible(false);
  39. } catch (NoSuchFieldException e) {
  40. Field nameServicesField = addressClass.getDeclaredField("nameServices");// 对于OpenJDK
  41. nameServicesField.setAccessible(true);
  42. List<sun.net.spi.nameservice.NameService> nameServices = (List<sun.net.spi.nameservice.NameService>) nameServicesField.get(null);
  43. if (nameServices != null && nameServices.size() > 0) {
  44. /* 置换为代理实例 */
  45. nameServices.set(0, new NameServiceProxy(nameServices.get(0)));
  46. } else {
  47. // 可能为空吗? 待测
  48. }
  49. nameServicesField.setAccessible(false);
  50. }
  51. getHttpConent("www.baidu.com");
  52. }
  53. public static void changeDNSWithCddressCache() throws Exception {
  54. /* 1. 获取反身类 */
  55. Class<?> addressClass = InetAddress.class;
  56. /* 2. 获取addressCache字段 */
  57. Field addressCacheField = addressClass.getDeclaredField("addressCache");
  58. /* 3. 获取addressCache */
  59. addressCacheField.setAccessible(true);
  60. Object addressCache = addressCacheField.get(null);
  61. addressCacheField.setAccessible(false);
  62. /* 4. 获取addressCache的反射类 */
  63. Class<?> addressCacheClass = addressCache.getClass();
  64. /* 5. 获取addressCache的put方法 */
  65. Method putMethod = addressCacheClass.getDeclaredMethod("put", String.class, InetAddress[].class);
  66. /* 5. 修改addressCache将wwww.baidu.com换成指定任意IP */
  67. putMethod.setAccessible(true);
  68. putMethod.invoke(addressCache, "www.baidu.com", new InetAddress[] { InetAddress.getByAddress(new byte[] { 115, (byte) 239, (byte) 210, 26 }) });
  69. putMethod.setAccessible(false);
  70. /* 6.测试,看看是否连通 */
  71. getHttpConent("www.baidu.com");
  72. }
  73. private static void getHttpConent(String host) throws MalformedURLException, IOException {
  74. HttpURLConnection conn = (HttpURLConnection) new URL("http://" + host).openConnection();
  75. try {
  76. conn.setConnectTimeout(3000);// 减少连接时间,方便测试
  77. conn.setDefaultUseCaches(false);
  78. conn.setDoInput(true);
  79. conn.setRequestMethod("GET");
  80. conn.connect();
  81. int code = conn.getResponseCode();
  82. System.out.format("REST[%d]\n", code);
  83. InputStream in = null;
  84. in = conn.getErrorStream();// 如果非2xx,则由errorStream获取输出.
  85. if (in == null) {
  86. in = conn.getInputStream();
  87. }
  88. if (in != null) {
  89. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  90. for (String line = null; (line = reader.readLine()) != null;) {
  91. System.out.println(line);
  92. }
  93. }
  94. } finally {
  95. if (conn != null) {
  96. conn.disconnect();
  97. }
  98. }
  99. }
  100. @SuppressWarnings("restriction")
  101. public static class NameServiceProxy implements sun.net.spi.nameservice.NameService {
  102. final sun.net.spi.nameservice.NameService nameService;
  103. final Map<String, InetAddress[]> mapping = new HashMap<String, InetAddress[]>();
  104. {
  105. try {
  106. mapping.put("www.baidu.com", new InetAddress[] { InetAddress.getByAddress(new byte[] { 115, (byte) 239, (byte) 210, 26 }) });
  107. } catch (UnknownHostException e) {
  108. e.printStackTrace();
  109. }
  110. }// 实例初始化表
  111. public NameServiceProxy(sun.net.spi.nameservice.NameService nameService) {
  112. this.nameService = nameService;
  113. }
  114. @Override
  115. public String getHostByAddr(byte[] addr) throws UnknownHostException {
  116. return this.nameService.getHostByAddr(addr);
  117. }
  118. @Override
  119. public InetAddress[] lookupAllHostAddr(String host) throws UnknownHostException {
  120. if (mapping.containsKey(host)) {
  121. return mapping.get(host);
  122. } else {
  123. return this.nameService.lookupAllHostAddr(host);
  124. }
  125. }
  126. }
  127. }

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

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

    在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet ...

  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. ORA-00933: SQL command not properly ended

    今天写了一个小的SQL语句类似下面的这句: UPDATE A SET ID=B.ID FROM A,B WHERE A.NAME=B.NAME 在执行时居然报了“ORA-00933: SQL comm ...

  2. 关闭GS选项,解决注入后崩溃

    利用CreateRemoteThread向进程注入远程代码时,一般会有以下两种做法: 利用LoadLibrary在目标进程加载指定的DLL 将代码复制到目标进程,然后启动这段代码 上面的第二种方法其实 ...

  3. 织梦dedecms简略标题调用标签用法指南

    我们在使用织梦DEDECMS建站过程中,为了使调用的文章标题简短且相对完整(原文标题太长),只好使用了调用简略标题这个方法,使标题显示为简短标题,指向标题时显示完整的标题.并获得文章静态地址链接 下面 ...

  4. Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间

    alter table userInfo add(msn varchar2(20)); 1.建表 create table userInfo ( id number(6), name varchar2 ...

  5. 浅谈JavaScript的事件响应

    原文出处: Christian Heilmann   译文出处:Chajn Science 每当猴子们问我JavaScript和DOM里啥东西最牛逼时,我都会一巴掌打回去:卧槽还用问么当然是事件响应了 ...

  6. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  7. SAP物料价格评估与成本计算体系

    物料评估目的 核算物料领用与消耗的价值,使生产成本与产品销售成本有统一计价标准. 核算企业库存价值. 物料价格方法 移动平均价,标准价,实际价,计划价. @移动平均价: 每次物料移动后重新计算平均价, ...

  8. zedboard上移植OPENCV库

    zedboard上移植OPENCV库 之前做了很多移植OPENCV库的工作,但是需要包含的各种库,需要交叉编译,X264 ,JPGE ,FFMPGE等等 注意:在<嵌入式系统软硬件协同设计实战指 ...

  9. 安装JAVA JDK注意事项

    1 WIN8系统 安装JDK  我安装的是1.6版本,   64位的 : 2 安装好后  cmd  输入 java -version  正常 java  命令  正常 javac 命令不正常    提 ...

  10. 详说 Cookie, LocalStorage 与 SessionStorage

    本文最初发布于我的个人博客:咀嚼之味 最近在找暑期实习,其中百度.网易游戏.阿里的面试都问到一些关于HTML5的东西,问题大多是这样开头的:“你用过什么HTML5的技术呀?” 而后,每次都能扯到 Co ...