说到动态代理不得不说下静态代理。(基于接口)
动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
何为代理?
所谓代理就是为其他对象提供一种代理以控制对这个对象的访问。
结构:一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。
应用场景:事物控制、日志、统计方法的执行效率。
话不多说,首先看下静态代理上代码
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();
}
}
1777

被折叠的 条评论
为什么被折叠?



