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);
}
}
Proxy
最新推荐文章于 2024-06-02 11:40:05 发布