zoukankan      html  css  js  c++  java
  • JDK动态代理实现

    创建一个实现类的接口,因为动态代理的本质其实就是代理接口

    package com.xiawei.reflect.jdkproxy;

    public interface JavaClassDao {

    public void say();
    }

    ===========================================

    实现上面的借口

    package com.xiawei.reflect.jdkproxy;

    public class JavaClassDaoImpl implements JavaClassDao{

    @Override
    public void say() {
    System.out.println("这是真实对象的方法!");
    }

    }

    ===========================================

    创建动态代理类,并让其实现 java.lang.reflect.InvocationHandler接口

    package com.xiawei.reflect.jdkproxy;

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

    public class JdkProxyClass implements InvocationHandler {
    //定义一个真实对
    private Object target;
    //创建真实对象与代理对象的代理关系,并返回代理对象
    public Object bind(Object target){
    this.target = target;
    return Proxy.newProxyInstance(target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), this);
    }

    //代理方法逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //在代理方法逻辑中,可以在调用真实对象的方法前执行需要的方法逻辑
    System.out.println("在调用真实对象的方法前,执行的方法逻辑!");
    //调用真实对象的方法
    Object object = method.invoke(target, args);//通过反射执行目标对象的方法[这里相当于target.]
    //在代理方法逻辑中,可以在调用真实对象的方法后执行需要的方法逻辑
    System.out.println("在调用真实对象的方法后,执行的方法逻辑。");
    //在这里,如果调用的真实对象没有返回值,则object为null,否则返回调用对象方法的返回结果
    return object;
    }

    }

    ===========================================

    package com.xiawei.reflect.jdkproxy;

    public class Test {

    public static void main(String[] args) {
    //要调用真实类的方法,就要先创建 代理类对象
    JdkProxyClass jpc = new JdkProxyClass();
    //然后通过代理类对象的bind()方法获得代理对象(即:绑定关系,因为挂在接口JavaClassDao下面)
    //所以申明代理对象JavaClassDao proxy
    JavaClassDao proxy = (JavaClassDao) jpc.bind(new JavaClassDaoImpl());
    //通过代理对象调用真实类的方法
    proxy.say();

    }

    }

    //测试结果:

      在调用真实对象的方法前,执行的方法逻辑!
      这是真实对象的方法!
      在调用真实对象的方法后,执行的方法逻辑。

  • 相关阅读:
    GAC的理解及其作用 [转]
    Binding Policy in .NET/ Assembly search order (Bin/GAC)
    Batch update
    Table-Valued Parameters in SQL Server 2008 (ADO.NET)
    EXT的bug 布局border 和 grid的cellediting
    ext 的controller中的refs的使用方法
    Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据
    php 与mysql 数据库
    前端开发和后端开发
    http 你造吗?
  • 原文地址:https://www.cnblogs.com/xiaweicn/p/8666625.html
Copyright © 2011-2022 走看看