动态代理设计模式

由于静态代理设计模式,在代理功能比较多时,代理类中方法需要写很多,

为了解决镜头代理频繁编写代理功能缺点,引入了动态代理。

接口

package com.fd.proxy.dynamic;

public interface Func {
	public void A();
	public void B();
	public void C();
}

  

真实类

package com.fd.proxy.dynamic;

public class MyProxy implements Func{

	@Override
	public void A() {
		System.out.println("Proxy A");
		
	}

	@Override
	public void B() {
		System.out.println("Proxy B");
	}

	@Override
	public void C() {
		System.out.println("Proxy C");
	}

}

  代理类 代理类需要实现InvocationHandler,通过反射机制进行调用真实类的方法

package com.fd.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class Agent implements InvocationHandler{
	private MyProxy proxy = new MyProxy();
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
		System.out.println("Agent Before Method");
		
		Object obj = arg1.invoke(proxy, arg2);
		
		System.out.println("Agent After Method");
		return obj;
	}

}

  测试

package com.fd.proxy.dynamic;

import java.lang.reflect.Proxy;

public class TestMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Agent agent = new Agent();
		
		Func func = (Func)Proxy.newProxyInstance(TestMain.class.getClassLoader(), new Class[] {Func.class}, new Agent());
		func.A();
		func.B();
		func.C();
	}

}

  

posted @ 2018-09-24 10:15  SparkQuant  阅读(419)  评论(0编辑  收藏  举报