Java静态代理和动态代理的简单代码实现。

静态代理:

package com.text.sgl;
/**
  * 静态代理
  * @author shen.guoliang
  * @version 1.0, 2017年8月27日  每次修改后更新版本号,日期和修改内容
  * @see	[相关类/方法]
  * @since	[产品/模块版本]
  */
interface ClothFactory{
	//制作衣服
	public void dowork();
} 

//被代理对象
class NakeCloth implements ClothFactory{

	@Override
	public void dowork() {
		System.out.println("耐克生产的衣服!");	
	}
	
}

//代理类
class DailiCloth  implements ClothFactory{
	NakeCloth nc;
	@Override
	public void dowork() {
		nc.dowork();
	}
	
	public DailiCloth(NakeCloth nc){
		this.nc = nc;
	}
}

public class StaticText {
	
	public static void main(String[] args) {
		NakeCloth nc = new NakeCloth();
		DailiCloth dc = new DailiCloth(nc);
		dc.dowork();
	}
}



动态代理:

package com.text.sgl;

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

/**
  * 反射机制动态代理实例
  * @author shen.guoliang
  * @version 1.0, 2017年8月27日  每次修改后更新版本号,日期和修改内容
  * @see	[相关类/方法]
  * @since	[产品/模块版本]
  */
//动态代理的使用
//(这是将被实现的接口实例)
interface Subject{
	//抽象方法
	void action();
}

//被代理类
class RealSubject implements Subject{

	@Override
	public void action() {
		System.out.println("我是被代理类,记得执行我奥!");
	}
} 

//实现InvocationHandler接口的对象,用来动态生成代理类的对象等
class MyInvocationHandler implements InvocationHandler{
	Object obj;//实现了接口的被代理类对象的声明
	
	//1:给被代理类对象实例化  2:返回一个代理类对象
	public Object blind(Object obj){
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);		
	}
	//当通过代理类的对象发起被重写的方法的调用时,都会转换为对如下的invoke方法的调用
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//method方法的返回值是value
		Object value = method.invoke(obj, args);
		return value;
	}
	
}

public class TestProxy {
	public static void main(String[] args) {
		//创建一个被代理类对象
		RealSubject rs = new RealSubject();
		
		//创建一个实现了InvocationHandler接口的自动生成代理类工具类对象
		MyInvocationHandler mh = new MyInvocationHandler();
		//调用blind()方法,动态返回一个实现Subject接口的代理类对象
		Object obj = mh.blind(rs);
		//强转
		Subject sbj = (Subject)obj;
		//执行action()方法其实转到对InvocationHandler接口的实现类的invoke()方法的调用,实际还是调的被代理对象重写的action()的方法,从而实现动态代理
		sbj.action();
		
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值