1.Dog.java
package com.proxy;
public interface Dog {
public void info();
public void run();
}
2.DogImpl.java
package com.proxy;
public class DogImpl implements Dog {
public void info() {
System.out.println("我是一只猎狗");
}
public void run() {
System.out.println("我奔跑迅速");
}
}
3.DogIntercepter.java
package com.proxy;
//定义系统拦截器类,用于拦截Dog实例
public class DogIntercepter {
//第一个拦截器方法
public void method1(){
System.out.println("========模拟通用方法1=========");
}
//第二个拦截器方法
public void method2(){
System.out.println("========模拟通用方法2=========");
}
}
4.MyProxyFactory.java
package com.proxy;
import java.lang.reflect.*;
/*
* 系统还需要一个代理工厂,代理工厂的主要作用是根据目标对象生成一个代理对象,
* 实际上这个代理对象里的方法是目标对象的方法和拦截器方法的组合。。。正是通过些
* 实现拦截
*/
public class MyProxyFactory {
public static Object getProxy(Object object){
//代理处理类
ProxyHandler handler=new ProxyHandler();
//把该Dog实例托付给代理操作
handler.setTarget(object);
//第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
//第二个参数是接口数组,正是代理该接口数组
//第三个参数是代理包含的处理实例。
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);
}
}
5.ProxyHandler.java
package com.proxy;
/*
* 动态调用目标对象的方法
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.*;
public class ProxyHandler implements InvocationHandler {
//需被代理的目标对象
private Object target;
//创建拦截器实例
DogIntercepter di=new DogIntercepter();
//执行代理的目标方法时,该invoke方法会被自动调用
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
//如果被调用的方法是info
if(method.getName().equals("info")){
//调用拦截器方法1
di.method1();
result=method.invoke(target, args);
//调用拦截器方法2
di.method2();
}else{
result=method.invoke(target, args);
}
return result;
}
//用于设置传入目标对象方法
public void setTarget(Object o){
this.target=o;
}
}
6.TestDog.java
package com.proxy;
public class TestDog {
public static void main(String args[]){
Dog targetObject=new DogImpl();
Dog dog=null;
Object proxy=MyProxyFactory.getProxy(targetObject);
if(proxy instanceof Dog){
dog=(Dog)proxy;
}
dog.info();
dog.run();
}
}
分享到:
相关推荐
JDK动态代理proxy的基本工作原理代码!!
java 动态代理Proxy应用和底层源码分析.pdf
1. 首先完成一个接口的创建(里面有真正的想要实现的方法): public interface UserDAO{ public void add (); //想要实现的方法 } 2. 写一个真实的主题类实现...3. 写一个动态的代理类实现InvocationHandler接口:
NULL 博文链接:https://softwarexiang120.iteye.com/blog/2277356
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
动态代理 Proxy
AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
JAVA动态代理,采用Proxy与InvocationHandler实现。
NULL 博文链接:https://sunlibao123.iteye.com/blog/1837500
Nginx在vhost里的配置站点,通过proxy转发到动态域名的具体配置。 反向代理,动态域名 ,Proxy
简易高效的代理池,提供如下功能: 1. 定时抓取免费代理网站,简易可扩展 2. 使用 Redis 对代理进行存储...Github 链接:https://github.com/Python3WebSpider/ProxyPool 详情阅读:README.md,使用方法及相关信息讲解
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
FoxyProxy 是一款高级代理服务器管理工具,是 Firefox 火狐浏览器的代理插件,相比比 SwitchProxy、ProxyButton、QuickProxy、xyzproxy、ProxyTex 等扩展提供更多的功能。 FoxyProxy 通过使用通配符、正则表达式和...
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了… 太难了!!! 之前文章的链接: 动态代理学习(一)自己动手模拟JDK动态代理、 动态代理学习(二)JDK动态代理源码分析...
详细介绍ArcGIS JS API跨域配置 介绍Proxy 代理不同web服务器环境部署和调用
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { ...
Proxy提供了用于创建动态代理类和代理对象的静态方法,他也是所有动态代理类的父类,如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,如果需要为一个或多个接口动态的创建实例,也...