第18章 类加载机制与反射-JDK动态代理

来源:互联网 发布:虎视眈眈单人动作数据 编辑:程序博客网 时间:2024/06/04 19:47
  • 两个重点: Proxy类和InvocationHandler接口
    1.定义接口
    2.定义动态代理的对象,该对象实现接口
    3.定义通用方法的类,该类中定义通用方法(例如记录开始日志方法,结束日志方法)
    4.定义实现InvocationHandler的方法(调用通用方法,使用反射调用被代理对象的方法)
    5.定义动态代理对象工厂类,即根据target生成动态代理对象
    6.测试
// 1.定义接口public interface Dog {    void info();    void run();}
// 2.定义动态代理的对象,该对象实现接口public class DogUtil {    // 第一个拦截器方法    public void method1(){        System.out.println("模拟第一个通用方法");    }    // 第二个拦截器方法    public void method2(){        System.out.println("模拟第二个通用方法");    }}
public class GunDog implements Dog{    @Override    public void info() {        System.out.println("我是只猎狗!");    }    @Override    public void run() {        System.out.println("我跑的很快!");    }}
public class MyInvocationHandler implements InvocationHandler {    //  需要被代理的对象    private Object target;    public void setTarget(Object target) {        this.target = target;    }    @Override    public java.lang.Object invoke(java.lang.Object proxy, Method method, java.lang.Object[] args) throws Throwable {        //  通用方法一  例如日志开始        DogUtil du = new DogUtil();        du.method1();        //  info()  run() 以target作为主调来执行method方法        //  此处为被代理对象,本身执行的方法        java.lang.Object result=method.invoke(target,args);        // 通用方法二 例如日志结束        du.method2();        return result;    }}
public class MyProxyFactory {    //  为指定的target生成动态代理对象    public  static java.lang.Object getProxy(Object target){        MyInvocationHandler handler = new MyInvocationHandler();        handler.setTarget(target);        // 返回动态代理对象        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);    }}
public class MyProxyTest {    public static void main(String[] args) {        Dog target = new GunDog();        Dog dog = (Dog)MyProxyFactory.getProxy(target);        dog.info();        dog.run();//        输出结果://        模拟第一个通用方法//        我是只猎狗!//        模拟第二个通用方法//        模拟第一个通用方法//        我跑的很快!//        模拟第二个通用方法    }}
0 0
原创粉丝点击