动态代理笔记

动态代理

创建两个接口

package cn.Proxy;

public interface TableInter {
    void insert();
    void delete();
    void update();
    void select();
}
package cn.Proxy;

public interface TestInter {
    void show(String message);
    int getSum(int a,int b);
}

创建一个类实现这两个接口

package cn.Proxy;

public class StudentDaoImpl implements TableInter, TestInter {

    public void show(String message) {
        System.out.println(message);
    }

    @Override
    public int getSum(int a, int b) {
        return a+b;
    }

    @Override
    public void insert() {
        System.out.println("插入信息");
    }

    @Override
    public void delete() {
        System.out.println("删除信息");
    }

    @Override
    public void update() {
        System.out.println("更新信息");
    }

    @Override
    public void select() {
        System.out.println("查询消息");
    }

}

主函数

package cn.Proxy;

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

public class ProxyDemo {
    public static void main(String[] args) {
        StudentDaoImpl studentDao = new StudentDaoImpl();

        // 创建一个动态代理对象,让代理对象来执行这些方法
        /*
         * 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 
         * loader - 定义代理类的类加载器 
         * interfaces - 代理类要实现的接口列表
         * h - 指派方法调用的调用处理程序
         */
        Object obj = Proxy.newProxyInstance(studentDao.getClass().getClassLoader(), studentDao.getClass().getInterfaces(),new MyInvocationHandler(studentDao));
        TableInter ti = (TableInter)obj;
        ti.insert();
        ti.delete();
        ti.update();
        ti.select();

        TestInter tt = (TestInter)obj;
        tt.show("动态代理太简单了");
        int sum = tt.getSum(100, 200);
        System.out.println(sum);


    }
}

//InvocationHandler 是代理实例的调用处理程序 实现的接口
class MyInvocationHandler implements InvocationHandler{

    private Object obj;
    MyInvocationHandler(Object obj){
        this.obj = obj;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("检查权限");
        Object value = method.invoke(obj, args);
        System.out.println("记录日志");
        System.out.println("--------------------");
        return value;
    }

}

结果:

检查权限
插入信息
记录日志
--------------------
检查权限
删除信息
记录日志
--------------------
检查权限
更新信息
记录日志
--------------------
检查权限
查询消息
记录日志
--------------------
检查权限
动态代理太简单了
记录日志
--------------------
检查权限
记录日志
--------------------
300

猜你喜欢

转载自blog.csdn.net/qq_42982169/article/details/82019748