前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java代理设计模式详解

Java代理设计模式详解

作者头像
迹_Jason
发布2019-05-28 12:30:25
2780
发布2019-05-28 12:30:25
举报
文章被收录于专栏:迹_Jason的AppZone迹_Jason的AppZone

代理即通过代理类,找到适合你的实现类。相当于现实生活中的中介的角色,你想租房子,这个时候你又不想自己找房子,那你可以找中介,通过中介找到合适自己的房子,同时你也可以让中介帮你签合同等其他事宜。代理存在静态代理和动态代理两种

静态代理

代码语言:javascript
复制
public interface Sourceable {  
    public void method();  
}
代码语言:javascript
复制
public class Source implements Sourceable {  
  
    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}
代码语言:javascript
复制
public class Proxy implements Sourceable {  
  
    private Source source;  
    public Proxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
      //新增的处理,个性化处理
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}

测试类

代码语言:javascript
复制
public class ProxyTest {  
  
    public static void main(String[] args) {  
        Sourceable source = new Proxy();  
        source.method();  
    }  
  
}

动态代理

JDK动态代理、AOP动态代理

Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类

创建动态代理类

static Class<?>getProxyClass(ClassLoader loader,Class<?>…interfaces):创建一个动态代理类锁对应的Class对象,该代理类将实现interface所指定的多个接口,第一个ClassLoader 参数指生成动态代理类的类加载器。

创建动态代理对象

static Object newProxyInstance(ClassLoader loader,Class<?>…interfaces,InvocationHadnler h):直接创建一个动态代理对象,该代理对象的实现类实现了interfaces指定的系列接口,执行代理对象的每个方法时都会被替换执行InvocationHadnler对象的invoke方法

代码语言:javascript
复制
public interface Colorable {
	 public void value();
}
代码语言:javascript
复制
public class RedColor implements Colorable{
	 @Override
	    public void value() {
	        System.out.println("--------------red-------------");
	    }
}
代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableProxy implements InvocationHandler {

	private Colorable colorable;
	private Colorable proxy;

	public ColorableProxy(Colorable colorable) {
		this.colorable = colorable;
		this.proxy = (Colorable) Proxy.newProxyInstance(
				Colorable.class.getClassLoader(),
				new Class<?>[] { Colorable.class }, this);
	}

	public Colorable getProxy() {
		return proxy;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		String methodName = method.getName();

		System.out.println("===========starting invoke function:" + methodName
				+ "==========");

		Object result = method.invoke(colorable, args);

		System.out.println("=========== invoke function:" + methodName
				+ " success==========");
		return result;
	}

	public static void main(String[] args) {

		Colorable proxy = new ColorableProxy(new RedColor()).getProxy();
		//真正调用invoke方法是在这一步才被激发的,可以debug试一下
		proxy.value();
	}

}

结果

代码语言:javascript
复制
===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

proxy:代表动态代理对象 method:代表正在执行的方法 args:代表调用目标方法时传入的实参

AOP动态代理
这里写图片描述
这里写图片描述
代码语言:javascript
复制
public interface Colorable {
	 public void value();
}
代码语言:javascript
复制
public class RedColor implements Colorable{
	 @Override
	    public void value() {
	        System.out.println("--------------red-------------");
	    }
}
代码语言:javascript
复制
public class ToolUtility {

	public void method(){
		System.out.println("运行工具方法");
	}
}
代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableAOProxy implements InvocationHandler {
	private Colorable colorable;
	private Colorable proxy;

	public ColorableAOProxy(Colorable colorable) {
		this.colorable = colorable;
		this.proxy = (Colorable) Proxy.newProxyInstance(
				Colorable.class.getClassLoader(),
				new Class<?>[] { Colorable.class }, this);
	}

	public Colorable getProxy() {
		return proxy;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		ToolUtility tool = new ToolUtility();
		tool.method();
		String methodName = method.getName();
		System.out.println("===========starting invoke function:" + methodName
				+ "==========");
		Object result = method.invoke(colorable, args);

		System.out.println("=========== invoke function:" + methodName
				+ " success==========");
		return result;
	}

	public static void main(String[] args) {
		Colorable proxy = new ColorableAOProxy(new RedColor()).getProxy();
		// 真正调用invoke方法是在这一步才被激发的,可以debug试一下
		proxy.value();
	}
}

结果

代码语言:javascript
复制
运行工具方法
===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态代理
  • 动态代理
    • AOP动态代理
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档