java动态代理 小例子

动态代理

  • 动态代理:使用一个代理将对象包装起来 ,然后用该代理对象取代原始的代理;
  • 在面对原始对象上 的调用都要通过代理
  • 代理对象决定是否以及何时将方法调用转到原始对象上

静态代理 & 动态代理 例子

静态代理

/**
 * 静态代理类:代理类和被代理类在编译期间 就已经确定下来了
 * @author worm
 */
interface ClothFactory{
	void produceCloth();
}
//代理类
class ProxyClothFactory implements ClothFactory{
	private ClothFactory clothFacory;//被代理对象 进行实例化
	public ProxyClothFactory(ClothFactory clothFacory) {
		this.clothFacory=clothFacory;
	}
	@Override
	public void produceCloth() {
		//可以代理工厂可以执行一定得操作
		System.out.println("代理工厂执行一些方法。。。");
		clothFacory.produceCloth();//
		System.out.println("代理工厂执行操作");
	}
}
class NikeClothFactory implements ClothFactory{//被代理类
	@Override
	public void produceCloth() {
		System.out.println("Nike factory...");
	}
}
public class StaticProxyTest {
	public static void main(String[] args) {
		NikeClothFactory nikeClothFactory=new NikeClothFactory();//被代理对象
		ProxyClothFactory proxyClothFactory=new ProxyClothFactory(nikeClothFactory);//创建代理类对象		
		proxyClothFactory.produceCloth();//通过代理类对象调用被代理
	}
}

动态代理例子

interface Human{
	String getBelied();
	void eat(String food) ;
}
class SuperMan implements Human{//被代理类
	@Override
	public String getBelied() {
		return "I believe T can fly!";
	}
	@Override
	public void eat(String food) {
		System.out.println("like eat :"+food);
	}
}
/*
 * 要实现动态代理需要解决的问题:
 * 1.怎么根据加载到内存中的被代理类 ,动态的创建一个代理类以及代理类对象
 * 2.当通过代理类的对象时 如何动态的去调用被代理类中的同名方法
 */
class ProxyFactory{
	public static Object getProxyInstance(Object obj) {//obj:被代理类对象
		MyInvocationHandler handler=new MyInvocationHandler();
		handler.bind(obj);//这里就创建被被代理类对象
		//返回一个代理类对象  Object是一个代理类的对象
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler );
	}
}
class MyInvocationHandler implements InvocationHandler{
	private Object obj;//被代理类对象  赋值时使用被代理类对象复制
	public void bind(Object obj) {
		this.obj=obj;
	}
	//通过代理类对象,调用方法时,会自动的调用invoke()
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//proxy :代理类对象    method:代理类对象调用的方法 
		//当通过代理类的对象时 如何动态的去调用被代理类中的同名方法
		//将被代理类要执行的方法声明在这里 invoke()
		return method.invoke(obj, args);//method:即为代理类对象,此方法就作为被代理独享要调用的方法
	}
}
public class ProxyTest {
	public static void main(String[] args) {
		SuperMan superMan=new SuperMan();//被代理类对象
		Human proxyInstance=(Human)ProxyFactory.getProxyInstance(superMan);
		//当通过调用代理类对象调用方法时 会自动调用被代理类中 同名的方法
		String belief=proxyInstance.getBelied();
		System.out.println(belief);
		proxyInstance.eat("川菜");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值