反射 实现动态代理

1)创建接口

public interface IUserDao {
void add();
void delete();
void find();
void update();
}

2)实现接口1

public class UserDaoImpl implements IUserDao{
@Override
public void add() {
System.out.println(“添加用户”);
}

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

@Override
public void find() {
    System.out.println("查询用户");
}

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

}

3)实现接口2

package com.myh.jdk_dynamic_proxy;

public class UserDaoImpl2 implements IUserDao{
@Override
public void add() {
//在加入一些监控行为
System.out.println(“权限校验”);

    System.out.println("添加用户");

    System.out.println("日志记录");
}
@Override
public void delete() {
    //在加入一些监控行为
    System.out.println("权限校验");

    System.out.println("添加用户");

    System.out.println("日志记录");
}
@Override
public void find() {
    //在加入一些监控行为
    System.out.println("权限校验");

    System.out.println("添加用户");

    System.out.println("日志记录");
}
@Override
public void update() {
    //在加入一些监控行为
    System.out.println("权限校验");

    System.out.println("添加用户");

    System.out.println("日志记录");
}

}

4)创建JdkProxy类完成动态代理

import java.lang.reflect.Proxy;

/**
 * 代理:描述:让代理类帮助真实角色完成一些事情
 *   静态:代理和被代理类都需要实现同一个接口(线程中的Runnable接口)
 *   动态代理:在程序的执行过程中,通过反射的方式获取代理对象
 *      jdk动态代理:基于接口来完成 必须存在一个接口
 *      cglib动态代理:基于子类来完成
 *
 *  java.lang.reflect.Proxy提供用于创建动态代理类和实例的静态方法
 *  public static Object newProxyInstance(
 *      ClassLoader loader,//第一个参数,定义代理类的类加载器,类对象.getClass().getClassLoader();
 *      Class<?>[] interfaces,//第二个参数,代理类要实现的接口列表, 类对象.getClass().getInterfaces();
 *      InvocationHandler h //第三个参数,指派方法调用的调用处理程序,要创建InvocationHandler接口的实现类,自定义一个类来实现InvocationHandler,或者InvocationHandler接口的匿名内部类,重写方法,完成功能的增强,(接口:代理实例的调用处理程序 实现的接口 Object invoke(
     *          Object proxy,//在其上调用方法的代理实例
     *          Method method,//调用的接口方法的Method实例(需要被增强的业务方法)
     *          Object[] args //方法调用的参数值:就是当前业务方法中的参数(参数数组)
     *      )throws Throwable; //完成对userDao的业务功能的增强
 *      )
 *  )throws IllegalArgumentException
 */
public class JdkProxy {
    public static void main(String[] args) {
        //创建IUserDao类对象
        //接口多态实现
        IUserDao userDao = new UserDaoImpl();
        userDao.add();
        userDao.delete();
        userDao.find();
        userDao.update();

        System.out.println("===================");

        //版本2:针对上面的代码进行增强
        IUserDao userDao2 = new UserDaoImpl2();
        userDao2.add();
        userDao2.delete();
        userDao2.find();
        userDao2.update();

        System.out.println("没有使用动态代理完成==========================");
        MyInvocationHanler handler = new MyInvocationHanler(userDao);//针对userDao对象,产生代理实例
        //使用jdk动态代理完成
        IUserDao userDao3 = (IUserDao) Proxy.newProxyInstance(
                //代理类的类加载器
                userDao.getClass().getClassLoader(),
                //代理类要实现的接口列表的IUserDao public Class<?>[] getInterfaces()
                userDao.getClass().getInterfaces(),
                //指派方法调用的调用处理程序
                handler
        );
        userDao3.add();
        userDao3.delete();
        userDao3.update();
        userDao3.find();
        System.out.println("开始使用动态代理完成");
    }
}

5)创建InvocationHandler的实现类
import org.omg.CORBA.SystemException;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.InvokeHandler;
import org.omg.CORBA.portable.OutputStream;
import org.omg.CORBA.portable.ResponseHandler;

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

/**
 * 指派的代理程序
 */
public class MyInvocationHandler implements InvocationHandler {
    private Object target;//目标对象 userDao(针对谁来产生代理对象)

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

  /*  @Override
    public OutputStream _invoke(Object proxy,String method, InputStream input, ResponseHandler handler) throws SystemException {
    }*/

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("权限校验1");//method:针对业务方法调用

        Object obj = method.invoke(target, args);//add,delte,update,find

        System.out.println("日志记录检查");

        return obj;//返回技术代理实例
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值