@[TOC]底层原理的一些实现上代码:
实现接口:
/**
* @Description: 会被实现的代理接口
* @author yinxin
* @date 2022/2/2410:40
* @version 1.0
*/
public interface Singer {
void sing();
}
实现类:(希望没有侵犯到张杰的姓名权)
/**
* @author yinxin
* @version 1.0
* @Description: 实现类
* @date 2022/2/2410:51
*/
public class ZhangJie implements Singer{
private String words;
public ZhangJie() {
}
public ZhangJie(String words) {
this.words = words;
}
@Override
public void sing() {
System.out.println("ZhangJie sing: "+words);
}
}
动态代理的实现:
/**
* @author yinxin
* @version 1.0
* @Description: 动态代理的实现
* @date 2022/2/2410:25
*/
//首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
public class LogInvocationHandler implements InvocationHandler {
public Singer singer;
public LogInvocationHandler(Singer singer) {
this.singer = singer;
}
@Override
public Object invoke(Object o, Method method, Object[] args) throws Throwable {
//当代理对象嗲用say方法时候触发
Object invoke;
if("sing".equals(method.getName())){
//对sing方法的增强
System.out.println("动态代理开始");
invoke = method.invoke(singer, args);
System.out.println("动态代理结束");
}else {
invoke = method.invoke(singer, args);
}
return invoke;
}
// 这里为了方便就在这个类中写主启动类测试
public static void main(String[] args) {
Singer zhangJie = new ZhangJie("words");
Singer zjproxy= (Singer) Proxy.newProxyInstance(
zhangJie.getClass().getClassLoader(),//类加载器
new Class<?>[]{Singer.class},//代理需要实现的接口可以多个
new LogInvocationHandler(zhangJie )//方法的实际处理者
);
zjproxy.sing();
}
}
这只是一个开始像aop中提供的对方法增强的底层实现,还有很多实现大家可以以一去试着实现。