Proxy

package com.fuck996;

import com.fuck996.domain.User;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Proxy;
import java.util.List;

interface UserMapper{
    @Select("select * from user")
    @Update({"aaa","bbb"})
    List<User> selectAllUser();
    @Select("select * from user")
    List<User> getUserByUserName(String userName,int age);
}
public class MyProxy {
    public static void main(String[] args) {
        // 第一个参数是类加载器,这里我用的是本来的类加载器,实际上拿的就是系统类加载器
        // 第二个入参是一个要代理的接口的数据
        //  第三个入参是 invocationHandler
        // 返回的结果就是我们要获取到的实例
        // 为什么通过这样的方式去获取呢,因为接口是不能通过new创建出来的
        UserMapper mapper = (UserMapper) Proxy.newProxyInstance(MyProxy.class.getClassLoader(), new Class[]{UserMapper.class}, new InvocationHandler() {
            // method 是被拦截的方法(也就是实例调用的方法)
            // args  被拦截方法的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 获取被拦截的方法(获取的实例调用了什么方法,这里就拦截什么方法)
                System.out.println(method.getName());
                // 接下来我们去解析注解
                Select select = method.getAnnotation(Select.class);
                Parameter[] parameters = method.getParameters();
               /* for (Parameter parameter : parameters) {
                    String name = parameter.getName();
                    System.out.println(name);// 以此方法打印参数
                }*/
                if (null!=select) {
                    // valve就是注解中的内容
                    String[] value = select.value();
                    // 因为我在Select注解中传的不是数组,所以这里可以确定只有一个值
                    value[0]="select userName from user limit 0,1";
                    //String sql = value[0];
                    System.out.println("打印SQL:"+value[0]);
                    // 做一些拦截处理
                    String newSql=value[0]+"limit 0,1";
                    int length = args.length;
                    System.out.println(length);
                    for (Object arg : args) {
                       // System.out.println(arg); 实例调用时传入的参数  张无忌  20
                    }
                }

               /* Update update = method.getAnnotation(Update.class);
                String[] value = update.value();
                for (String s : value) {
                    System.out.println(s);
                }*/


                return null;
            }
        });
        // 拿到实例以后,接着我们就可以调用实例中的方法了
        mapper.getUserByUserName("张无忌",20);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值