标签:instance except blog 方式 odi 方法 访问 load abstract
代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
1.抽象类
public abstract class AbstractTarget{ public abstract void method(); }
2.具体目标对象
public class Target extends AbstractTarget{ @Override public void method() { System.out.println("原始的方法。"); } }
3.代理类
public class Proxy extends AbstractTarget{ private Target target; @Override public void method() { if(target==null){ target=new Target(); } System.out.println("原始方法前面增强!"); target.method(); System.out.println("原始方法后面增强!"); } }
测试
public class ProxyDemo{ public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.method(); } }
下面介绍一下JDK的动态代理的具体实现。
JDK动态代理主要实现方式是,Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
三个参数:
1.需要一个类加载器,可以通过 getClass().getClassLoader(),或者class.getClassLoader()获得。
2.需要一个Class数组,里面是目标对象的接口,可以通过getClass().getInterfaces(),或者class.getInterfaces()来获得。
3.需要一个InvocationHandler,这里我们自定义一个。
1.目标对象
public interface Person{ public void eat(); public void code(); } public class PersonImpl implements Person{ @Override public void eat() { System.out.println("Eat something."); } @Override public void code() { System.out.println("Coding"); } }
2.自定义InvocationHandler,用来对目标对象方法增强。
public class SelfInvocationHandler implements InvocationHandler { private Object target; public SelfInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Exception { System.out.println("你在干什么。"); Object value = method.invoke(target, args); System.out.println("你继续。"); return value; } }
测试
public class JDKProxyDemo { public static void main(String[] args) { Person person=new PersonImpl(); SelfInvocationHandler invocationHandler = new SelfInvocationHandler(person); Person proxyPerson = (Person) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), invocationHandler); proxyPerson.eat(); proxyPerson.code(); } }
标签:instance except blog 方式 odi 方法 访问 load abstract
原文地址:http://www.cnblogs.com/emoji1213/p/7617447.html