JDK静态代理及动态代理

代理模式
按照代理的创建时期,代理类可以分为两种:
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 
动态代理:在程序运行时,运用反射机制动态创建代理类的.class
代理模式的实现包括四部分,如图: 


静态代理:
接口:
package cn.cblue.service;
/**  
 * @Description: 接口
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午10:05:12
 * @version 1.0
 */

public interface PersonService {
	public void save(String name);
	public void update(String name,Integer personid);
	public String getPersonName(Integer personid);

}

目标类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;

/**  
 * @Description: 目标类
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午10:05:56
 * @version 1.0
 */

public class PersonServiceBean implements PersonService{

	private String user = null;
	
	public String getUser() {
		return user;
	}

	
	public PersonServiceBean() {
	}


	public PersonServiceBean(String user) {
		this.user = user;
	}

	@Override
	public String getPersonName(Integer personid) {
		System.out.println("method getPersonName() invoked");
		return "xxx";
	}

	@Override
	public void save(String name) {
		System.out.println("method save() invoked");
	}

	@Override
	public void update(String name, Integer personid) {
		System.out.println("method update() invoked");
	}

}

代理类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;

/**  
 * @Description: 静态代理类
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午10:04:20
 * @version 1.0
 */
public class PersonServiceProxy implements PersonService{
	private PersonServiceBean bean;
	public PersonServiceProxy() {
		bean = new PersonServiceBean();
	}
	
	public PersonServiceProxy(String name){
		bean = new PersonServiceBean(name);
	}
	@Override
	public void save(String name) {
		System.out.println("do something before");
		if(bean.getUser() != null){
			bean.save(name);
		}
		
		System.out.println("do something after");
	}
	
	@Override
	public String getPersonName(Integer personid) {
		return null;
	}

	@Override
	public void update(String name, Integer personid) {
		
	}
}
客户类:
import cn.cblue.service.impl.PersonServiceProxy;

public class Test {
    public static void main(String[] args) {
    	PersonServiceProxy bean = new PersonServiceProxy("zhangsan");
    	bean.save("zhangsan");
    }
}

动态代理:
动态代理跟静态代理的区别是代理类不是开发者用源代码定义出的,而是通过java的反射机制在程序运行期生成的。
“接口”,“目标类”,“客户类”,仍然需要开发者自己源代码定义,而代理类则由JDK提供的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口动态生成。
接口
package cn.cblue.service;
/**  
 * @Description: 接口
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午10:05:12
 * @version 1.0
 */

public interface PersonService {
	public void save(String name);
	public void update(String name,Integer personid);
	public String getPersonName(Integer personid);

}

目标类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;

/**  
 * @Description: 目标类
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午10:05:56
 * @version 1.0
 */

public class PersonServiceBean implements PersonService{

	private String user = null;
	
	public String getUser() {
		return user;
	}

	
	public PersonServiceBean() {
	}


	public PersonServiceBean(String user) {
		this.user = user;
	}

	@Override
	public String getPersonName(Integer personid) {
		System.out.println("method getPersonName() invoked");
		return "xxx";
	}

	@Override
	public void save(String name) {
		System.out.println("method save() invoked");
	}

	@Override
	public void update(String name, Integer personid) {
		System.out.println("method update() invoked");
	}

}

代理工厂类:
package cn.cblue.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.cblue.service.impl.PersonServiceBean;

/**  
 * @Description: 使用jdk中的proxy类动态生成代理类
 * @author huangzjb cblue2013@126.com
 * @Company Digital China
 * @date 2014-6-23 下午08:56:15
 * @version 1.0
 */

public class JDKProxyFactory implements InvocationHandler {
	
	private Object target;
	
	public Object createProxyIntance(Object target){
		this.target = target;
		Object object = Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
		return object;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		PersonServiceBean bean = (PersonServiceBean)this.target;
		Object result = null;
		if(bean.getUser() != null){
			result = method.invoke(target, args);
		}
		
		return result;
	}

}

客户类:
import cn.cblue.aop.JDKProxyFactory;
import cn.cblue.service.PersonService;
import cn.cblue.service.impl.PersonServiceBean;

public class AOPTest {
	public static void main(String[] args) {
		JDKProxyFactory factory = new JDKProxyFactory();
		PersonService bean = (PersonService) factory
				.createProxyIntance(new PersonServiceBean());
		bean.save("xxxx");
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值