----client---
package com.wjj.myproxy;
import com.wjj.proxy.Car;
public class Client {
public static void main(String[] args) {
try {
Moveable car = new Car();
InvocationHandler h = new LogIH(car);
Moveable ca = (Moveable)Proxya.getProxy(Moveable.class,h);
ca.move();
} catch (Exception e) {
e.printStackTrace();
}
}
}
------proxy ---
package com.wjj.myproxy;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
import com.wjj.proxy.Car;
public class Proxya {
public static Object getProxy(Class proxyinterface,InvocationHandler h)throws Exception{
Method[] methods = proxyinterface.getMethods();
String methodStr = "";
for(Method m : methods){
methodStr += "@Override\r\n";
methodStr +="public void " + m.getName() + "(){\r\n" +
"try{"+
"Method md = " + proxyinterface.getName() + ".class.getMethod(\"" + m.getName() + "\");\r\n"+
"h.invoke(this,md);\r\n" +
"}catch(Exception e){e.printStackTrace();\r\n}"+
"}";
}
String src = "package com.wjj.myproxy;\r\n"+
"import java.lang.reflect.Method;"+
"public class CarTimeProxy implements "+proxyinterface.getName()+" {"+
"com.wjj.myproxy.InvocationHandler h = null;"+
"public CarTimeProxy(InvocationHandler car) {"+
"super();"+
"this.h = car;"+
"}"+methodStr+
"}";
String fileName = System.getProperty("user.dir") +"/src/com/wjj/myproxy/CarTimeProxy.java";
File file = new File(fileName);
FileWriter writer = new FileWriter(file);
writer.write(src);
writer.flush();
writer.close();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(fileName);
CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
t.call();
fileMgr.close();
URL[] urls = new URL[]{new URL("file:/" + System.getProperty("user.dir")+"/src")};
URLClassLoader ul = new URLClassLoader(urls);
Class clazz = ul.loadClass("com.wjj.myproxy.CarTimeProxy");
System.out.println(clazz);
Constructor cos = clazz.getConstructor(InvocationHandler.class);
return cos.newInstance(h);
}
}
-------------------moveable ---
package com.wjj.myproxy;
public interface Moveable {
void move();
}
---------------------invocation---
package com.wjj.myproxy;
import java.lang.reflect.Method;
public interface InvocationHandler {
public void invoke(Object o,Method m);
}
-----------invocatin impl----
package com.wjj.myproxy;
import java.lang.reflect.Method;
public class LogIH implements InvocationHandler {
private Object target;
public LogIH(Object o){
this.target = o;
}
@Override
public void invoke(Object o, Method m) {
try {
System.out.println("invocate log start--------->");
long startTime = System.currentTimeMillis();
m.invoke(target, new Object[]{});
System.out.println("invocate log stop--------->");
System.out.println(System.currentTimeMillis() - startTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}
=========================
这样就 可以对任意对象,实现任意方法的代理, 其代理内写的方法, 就可以自己建一个invocationhandler 的实现类。
分享到:
相关推荐
本文将详细探讨InfluxDB的核心特性和Influx-proxy的功能,并结合"Influx-proxy-2.5.7-linux-amd64.tar.gz"这个压缩包文件,解析其在Linux AMD64平台上可能的部署与使用。 首先,InfluxDB以其高效的存储和查询机制而...
ios-webkit-debug-proxy-1.9.0-win64-bin
charles 解压就能用 charles-proxy-4.5.6-win64
4. **错误处理**:当代理过程中发生错误时,`http-proxy-middleware` 提供了错误处理机制,可以捕获并处理这些错误,避免应用程序崩溃。 5. **浏览器同步**:对于前端开发环境,`http-proxy-middleware` 可以与 ...
《GoProxy-Android:全能代理服务器在安卓平台的应用与实现》 GoProxy-Android是由snail007/goproxy团队开发的一款适用于安卓系统的全能代理服务器应用。此项目旨在为移动设备提供强大的网络代理功能,使得用户能够...
browsermob-proxy-2.1.4,与selenium一起进行爬虫,获取network中的链接资源
charles-proxy-4.5.6-win64.msi
charles-proxy-ssl-proxying-certificate.pem
Proxy-SwitchyOmega是一款强大的网络代理管理插件,专为Chromium浏览器(Chromium是Google Chrome浏览器的基础开源版本)设计。这款插件允许用户在不同的网络环境之间快速切换,包括HTTP、HTTPS、SOCKS4、SOCKS5等...
`mysql-proxy-0.8.5-windows-x86-34bit` 是 MySQL Proxy 的一个特定版本,适用于32位Windows操作系统。 MySQL Proxy 的主要功能和优势包括: 1. **透明代理**:MySQL Proxy 可以悄无声息地插入到客户端和服务器...
MJ-PROXY-PLUS-3.8.6免授权,功能和商用版本相同,最新版本,由于MJ官网更新,老版本已无法使用MJ-PROXY-PLUS,安装方法和老版本一样,详细可参考MJ-PROXY-PLUS配置教程。 使用自己的MJ账号,支持GPT3.5自动翻译等。...
node-https-proxy-agent, HTTPS端点的HTTP代理 `http.Agent` 实现 https-proxy-agent HTTPS的HTTP代理 http.Agent 实现 这个模块为连接到指定的HTTP或者HTTPS代理服务器提供了 http.Agent 实现,并且可以与内置的...
赠送jar包:hadoop-yarn-server-web-proxy-2.6.0.jar; 赠送原API文档:hadoop-yarn-server-web-proxy-2.6.0-javadoc.jar; 赠送源代码:hadoop-yarn-server-web-proxy-2.6.0-sources.jar; 赠送Maven依赖信息文件:...
browsermob-proxy-2.1.1-bin.zip
docker-letsencrypt-nginx-proxy-companion-examples, 结合 Docker gen和 letsencrypt Nginx 代理伙伴的示例 docker-letsencrypt-nginx-proxy-companion-examples这个库是使用 nginx代理插件, docker gen和 docker-...
标题中提到的"win64 charles-proxy-4.6.3-win64.msi"是Charles Proxy的4.6.3版本,专为Windows 64位操作系统设计的安装包。描述中的“亲测、可用、可升级”意味着这个版本已经过实际测试,不仅能够稳定运行,而且...
Charles(charles-proxy-4.6.2-win64.msi官方下载试用30天Windows 64位版本) 是在您自己的计算机上运行的 Web 代理(HTTP 代理/ HTTP 监视器)。然后,您的网络浏览器(或任何其他互联网应用程序)被配置为通过 ...
http-proxy-middleware 是一套 Node.js 代理中间件 for connect, express 和 browser-sync。安装$ npm install --save-dev http-proxy-middleware配置var proxyMiddleware = require('http-proxy-middleware'...
Proxy-SwitchyOmega是一款针对Chrome浏览器的扩展程序,主要用于网络代理管理和IP地址切换。这款插件对于需要频繁更换网络环境的用户,如开发者、网络测试人员或者需要访问不同地区服务的用户来说,非常实用。它允许...
代理服务器 BrowserMob Proxy,BrowserMob Proxy 简称 BMP,可以这么说,BMP 绝对是为 Selenium 为生的,Selenium + BMP 的完美搭配,可以实现很多你绝对想象不出来的功能