Java中的动态代理总结

说到动态代理不得不说下静态代理。(基于接口)

动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。

何为代理?

所谓代理就是为其他对象提供一种代理以控制对这个对象的访问。

结构:一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。

应用场景:事物控制、日志、统计方法的执行效率。

话不多说,首先看下静态代理上代码

package test;

public interface Subject {
	public void dosomething();
}
package test;

public class RealSubject implements Subject {

	@Override
	public void dosomething() {
		System.out.println("call dosomething()");
	}
}
package test;

public class SubjectProxy implements Subject {

	Subject sub = new RealSubject();
	
	@Override
	public void dosomething() {
		sub.dosomething();
	}
}
package test;

public class TestProxy {
	public static void main(String[] args) {
		Subject sub = new SubjectProxy();
	        sub.dosomething();
	}
}
以上就是静态代理,刚开始我会觉得SubjectProxy定义出来纯属多余,直接实例化实现类完成操作不就结了吗?后来随着业务庞大,你就会知道,实现proxy类对真实类的封装对于粒度的控制有着重要的意义。但是静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。所以引入动态代理来解决此类问题。

package test;

public interface Subject {
	public void dosomething();
}
package test;

public class RealSubject implements Subject {

	@Override
	public void dosomething() {
		System.out.println("call dosomething()");
	}
}
package test;

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

/**
 * @describe 动态代理类
 * @author lxh
 * @date 2018年3月19日
 */
public class ProxyHandler implements InvocationHandler{
	
	/**
	 * 动态代理的作用
	 * 1、Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;
	 * 2、可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;
	 * 3、解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变;
	 */
	
	private Object tar;
	
	public Object bind(Object tar) {
		this.tar = tar;
		/*
		 * 参数一:类加载器。固定写法,和被代理类使用相同的类加载器即可。
		 * 参数二:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
		 * 参数三:策略(方案)设计模式的应用。如何代理?
		 */
		return Proxy.newProxyInstance(tar.getClass().getClassLoader(),tar.getClass().getInterfaces(),this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		/*
		 * 参数一:代理对象本身的引用。一般用不着。
		 * 参数二:当前调用的方法。
		 * 参数三:当前方法用到的参数。
		 */
		Object result = null;
		result = method.invoke(tar,args);
		return result;
	}
}

package test;

public class TestProxy {
	public static void main(String[] args) {	
		ProxyHandler handler = new ProxyHandler();
		Subject subject = (Subject) handler.bind(new RealSubject());
		subject.dosomething();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值