动态代理

来源:互联网 发布:绝地求生优化太垃圾了 编辑:程序博客网 时间:2024/05/16 18:58

动态代理:

              1、首先要用动态代理,那么目标对象必须是面向接口编程,即目标对象的类要抽取出来接口。

package com.arvin.inter;public interface DogI {public abstract void info();public abstract void run();}

package com.arvin.inter.impl;import com.arvin.inter.DogI;public class Dog implements DogI {@Overridepublic void info() {System.out.println("一只可爱的dog!");}@Overridepublic void run() {System.out.println("跑得特别快!!");}}


              2、必须实现InvocationHandler接口,创建自己的调用处理器类。里面包含一个目标对象的引用target。

package com.arvin.invocation;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//我自己的调用处理器public class MyInvocationHandler implements InvocationHandler {// 目标对象private Object target;public MyInvocationHandler(Object target) {super();this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println(target.getClass().getInterfaces()[0].getName());// 在目标对象的方法执行之前简单的打印一下System.out.println("------------------before------------------");Object obj = method.invoke(target, args);// 在目标对象的方法执行之后简单的打印一下System.out.println("-------------------after------------------");return obj;}public Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(),this);}}

            3、创建目标对象的动态代理对象实例。

public Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(),this);}

            4、测试

package com.test;import com.arvin.inter.DogI;import com.arvin.inter.impl.Dog;import com.arvin.invocation.MyInvocationHandler;import com.arvin.invocation.ProxyGeneratorUtils;public class Test {public static void main(String[] args) {DogI dog = new Dog();// 实例化InvocationHandlerMyInvocationHandler invocationHandler = new MyInvocationHandler(dog);DogI d = (DogI) invocationHandler.getProxy();d.info();}}


0 0