Java动态替换InetAddress中DNS的做法简单分析2
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.net.HttpURLConnection;
- import java.net.InetAddress;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.UnknownHostException;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import sun.net.spi.nameservice.NameService;
- public class JavaDNSCacheTest {
- /**
- * 经测试,二种方式在Windows环境都可以, Linux环境待测
- *
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- /* 1. 动态替换AddressCache */
- // changeDNSWithAddressCache();
- /* 1. 动态代理NameService */
- changeDNSWithNameService();
- }
- public static void changeDNSWithNameService() throws Exception {
- /* 1. 获取反身类 */
- Class<?> addressClass = InetAddress.class;
- /* 2. 获取addressCache字段 */
- try {
- Field nameServiceField = addressClass.getDeclaredField("nameService");// 对于Jrockit或IBM JDK
- nameServiceField.setAccessible(true);
- sun.net.spi.nameservice.NameService nameService = (NameService) nameServiceField.get(null);
- nameServiceField.set(null, new NameServiceProxy(nameService));
- nameServiceField.setAccessible(false);
- } catch (NoSuchFieldException e) {
- Field nameServicesField = addressClass.getDeclaredField("nameServices");// 对于OpenJDK
- nameServicesField.setAccessible(true);
- List<sun.net.spi.nameservice.NameService> nameServices = (List<sun.net.spi.nameservice.NameService>) nameServicesField.get(null);
- if (nameServices != null && nameServices.size() > 0) {
- /* 置换为代理实例 */
- nameServices.set(0, new NameServiceProxy(nameServices.get(0)));
- } else {
- // 可能为空吗? 待测
- }
- nameServicesField.setAccessible(false);
- }
- getHttpConent("www.baidu.com");
- }
- public static void changeDNSWithCddressCache() throws Exception {
- /* 1. 获取反身类 */
- Class<?> addressClass = InetAddress.class;
- /* 2. 获取addressCache字段 */
- Field addressCacheField = addressClass.getDeclaredField("addressCache");
- /* 3. 获取addressCache */
- addressCacheField.setAccessible(true);
- Object addressCache = addressCacheField.get(null);
- addressCacheField.setAccessible(false);
- /* 4. 获取addressCache的反射类 */
- Class<?> addressCacheClass = addressCache.getClass();
- /* 5. 获取addressCache的put方法 */
- Method putMethod = addressCacheClass.getDeclaredMethod("put", String.class, InetAddress[].class);
- /* 5. 修改addressCache将wwww.baidu.com换成指定任意IP */
- putMethod.setAccessible(true);
- putMethod.invoke(addressCache, "www.baidu.com", new InetAddress[] { InetAddress.getByAddress(new byte[] { 115, (byte) 239, (byte) 210, 26 }) });
- putMethod.setAccessible(false);
- /* 6.测试,看看是否连通 */
- getHttpConent("www.baidu.com");
- }
- private static void getHttpConent(String host) throws MalformedURLException, IOException {
- HttpURLConnection conn = (HttpURLConnection) new URL("http://" + host).openConnection();
- try {
- conn.setConnectTimeout(3000);// 减少连接时间,方便测试
- conn.setDefaultUseCaches(false);
- conn.setDoInput(true);
- conn.setRequestMethod("GET");
- conn.connect();
- int code = conn.getResponseCode();
- System.out.format("REST[%d]\n", code);
- InputStream in = null;
- in = conn.getErrorStream();// 如果非2xx,则由errorStream获取输出.
- if (in == null) {
- in = conn.getInputStream();
- }
- if (in != null) {
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- for (String line = null; (line = reader.readLine()) != null;) {
- System.out.println(line);
- }
- }
- } finally {
- if (conn != null) {
- conn.disconnect();
- }
- }
- }
- @SuppressWarnings("restriction")
- public static class NameServiceProxy implements sun.net.spi.nameservice.NameService {
- final sun.net.spi.nameservice.NameService nameService;
- final Map<String, InetAddress[]> mapping = new HashMap<String, InetAddress[]>();
- {
- try {
- mapping.put("www.baidu.com", new InetAddress[] { InetAddress.getByAddress(new byte[] { 115, (byte) 239, (byte) 210, 26 }) });
- } catch (UnknownHostException e) {
- e.printStackTrace();
- }
- }// 实例初始化表
- public NameServiceProxy(sun.net.spi.nameservice.NameService nameService) {
- this.nameService = nameService;
- }
- @Override
- public String getHostByAddr(byte[] addr) throws UnknownHostException {
- return this.nameService.getHostByAddr(addr);
- }
- @Override
- public InetAddress[] lookupAllHostAddr(String host) throws UnknownHostException {
- if (mapping.containsKey(host)) {
- return mapping.get(host);
- } else {
- return this.nameService.lookupAllHostAddr(host);
- }
- }
- }
- }
Java动态替换InetAddress中DNS的做法简单分析2的更多相关文章
- Java动态替换InetAddress中DNS的做法简单分析1
在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet ...
- java itext替换PDF中的文本
itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...
- Java动态代理——框架中的应用场景和基本原理
前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...
- MessageFormat的用法,java动态替换String字符串中的占位符
import java.text.MessageFormat; import java.util.GregorianCalendar; import java.util.Locale; public ...
- 【Android】通过Java代码替换TabHost中的drawableTop资源
在博客 http://blog.csdn.net/jueblog/article/details/11837445 中的Tab选项卡中, 点击相应的Tab选项,图标没有发生改变. 这些资源图片也没有尽 ...
- Java动态调用类中方法
在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...
- Java 动态向 JTable 中添加数据
import java.awt.Toolkit; import javax.swing.SwingUtilities; import javax.swing.UIManager; import jav ...
- java.util.ComparableTimSort中的sort()方法简单分析
TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...
- java获取properties配置文件中某个属性最简单方法
假如我想获取src目录下sysConfig.properties中的uploadpath属性的值 方法如下所示: private static final ResourceBundle bundle ...
随机推荐
- java基础回顾(六)——WeakReference、SoftReference
在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1) ...
- vba 快速定位当前EXCEL最后一栏
工作的需要,有时会对EXCEL数据进行处理,比如格式化,有数据的单元格画横线. 最初,傻傻的,直接用个循环从第1行,一直往后找,判断是否为空,真傻. Function FindLastCell() D ...
- office 2003和office 2013同时安装使用的问题
电脑上同时安装了Office 2003和Office 2007/2010,先打开Word 2003,然后再打开Word 2010,总会弹出安装配置界面,反之亦然. 解决方法:使用快捷键Win+R打开 ...
- 理解python可变类型vs不可变类型,深拷贝vs浅拷贝
核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...
- [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)
通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上 ...
- poj1035 Spell checker
这题目比较简单,把思路搞清楚就可以啦. #include <stdio.h> #include <string.h> +][]; int init(){ ; while(~sc ...
- C# 通过this关键字来扩展方法
好处:不需要继承,对现有类型进行扩展 public static class ExtString { public static string myTest(this String str) { re ...
- Nginx 开启 path_info功能
server { listen ; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; roo ...
- 新手浅谈C#关于abstract和interface
abstract:抽象类,是对某一类对象的抽象,继承抽象类的类和抽象类是属于关系 interface:接口,可以说是一种规范,继承接口的类表达则是,我继承了这个接口,我能做什么 举个常用的例子:抽象一 ...
- iOS初学者的AppStore上架应用"菜谱大师"开源了!
本人是一名DoNet程序猿,在业余的时间自学了点iOS,于是就自己弄了一个小菜谱,自己要做菜的时候也就可以用自己的菜谱了. 现在将此应用开源给像我一样对iOS开发有兴趣,并且想学习iOS的园友,毕竟这 ...