特征:代理类和委托类有同样的接口,代理类主要为委托类预处理消息、过滤消息、把消息转发给委托类、以及事后处理消息等,代理类的本身并不能实现特定功能,代理类通过调用委托类对象的相应方法来提供特殊的服务。
按照代理的创建时期可分为两种:静态代理和动态代理
1、静态代理(class文件在运行之前已经生成)
package com.ifs.proxy;
public interface SimpleService {
public void add();
public void del();
}
package com.ifs.proxy;
public class SimpleServiceImpl implements SimpleService{
public void add() {
System.out.println("add()----------------");
}
public void del() {
System.out.println("del()----------------");
}
}
package com.ifs.proxy.state;
import com.ifs.proxy.SimpleService;
public class StaticProxy implements SimpleService {
private SimpleService simpleService;
public StaticProxy(SimpleService simpleService) {
this.simpleService = simpleService;
}
public void add() {
System.out.println("---------------------->before add()");
this.simpleService.add();
System.out.println("---------------------->after add()");
}
public void del() {
System.out.println("---------------------->before del()");
this.simpleService.del();
System.out.println("---------------------->after del()");
}
}
测试代码:
package com.ifs.proxy.state;
import com.ifs.proxy.SimpleServiceImpl;
public class TestStaticProxy {
public static void main(String[] args) {
StaticProxy proxy = new StaticProxy(new SimpleServiceImpl());
proxy.add();
proxy.del();
}
}
动态代理:动态代理类的字节码在程序运行时由Java反射机制动态生成,既简化的编程工作又提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类,java.lang.reflect 中Proxy类和InvocationHandler接口提高动态生成代码类的能力。
2、动态代理 JDK方式 (值针对存在实现接口的类)
复用之前的 SimpleService类和SimpleServiceImpl类
package com.ifs.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler{
private Object targetObject;
public Object newProxy(Object targetObject) {//将目标对象传入进行代理
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);//返回代理对象
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
checkPression();//一般我们进行逻辑处理的函数比如这个地方是模拟检查权限
Object ret = null; // 设置方法的返回值
ret = method.invoke(targetObject, args); //调用invoke方法,ret存储该方法的返回值
return ret;
}
private void checkPression() {//模拟检查权限的例子
System.out.println(">>检查权限 checkPression()!");
}
}
测试代码:
package com.ifs.proxy.jdk;
import com.ifs.proxy.SimpleService;
import com.ifs.proxy.SimpleServiceImpl;
public class TestJDKProxy {
public static void main(String[] args) {
JDKProxy proxy = new JDKProxy();
SimpleService simple = (SimpleService) proxy.newProxy(new SimpleServiceImpl());
simple.add();
}
}
3、动态代理 CGLIB
package com.ifs.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLIBProxy implements MethodInterceptor {
private Object targetObject;// CGLib需要代理的目标对象
public Object createProxyObject(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetObject.getClass());
enhancer.setCallback(this);
Object proxyObj = enhancer.create();
return proxyObj;// 返回代理对象
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
if ("add".equals(method.getName())) {// 过滤方法
checkPression();// 检查权限
}
obj = method.invoke(targetObject, args);
return obj;
}
private void checkPression() {
System.out.println(">>检查权限 checkPression()!");
}
}
测试代码:
package com.ifs.proxy.cglib;
import com.ifs.proxy.SimpleService;
import com.ifs.proxy.SimpleServiceImpl;
public class TestCGLIBProxy {
public static void main(String[] args) {
SimpleService simple = (SimpleService) new CGLIBProxy().createProxyObject(new SimpleServiceImpl());
simple.add();
simple.del();
}
}
两者动态代理的区别:
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
分享到:
相关推荐
利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能 详细:http://blog.csdn.net/wq105032007067/article/details/8812598
JAVA 通过proxy代理方式访问internet资源,
我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...
NULL 博文链接:https://cn-done.iteye.com/blog/1743191
代理模式java代码 Proxy(4) 开发宝典......
代理模式java代码 Proxy(5) 2个代理类 开发宝典
代理模式java代码 Proxy(1) java 学习必备......
用sun的JDK API实现java的动态代理类
NULL 博文链接:https://sunlibao123.iteye.com/blog/1837500
获取网络资源,使用动态代理ip解决单个ip访问次数限制问题
java 动态代理Proxy应用和底层源码分析.pdf
java proxy 代理,全套开发code,带注释,以及相关工具
JdkProxy.java
代理模式java代码 Proxy(3) 开发必备宝典......
代理模式java代码 Proxy(2) 开发必备宝典......
JAVA动态代理,采用Proxy与InvocationHandler实现。
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
HTTPS 代理-SNI Proxy-WebSocket 一直用sni proxy做https反向代理,但最近公司网站使用了WebSocket功能而sni proxy不支持。网上搜了一圈,也没找到简单的解决方案。用NGINX折腾了一天,但搭出来的系统很不稳定。...
全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...