this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method execution.");
Object result = method.invoke(target, args);
System.out.println("After method execution.");
return result;
}
}
* **创建代理对象**:使用Proxy.newProxyInstance方法创建代理对象。这个方法需要三个参数:类加载器、代理类实现的接口列表和InvocationHandler实例。
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
MyInterface target = new MyTarget();
MyInvocationHandler handler = new MyInvocationHandler(target);
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler
);
proxy.doSomething(); // 执行代理对象的方法
}
}
执行上述代码,你会看到在调用doSomething方法前后,都输出了日志信息,这就是通过JDK动态代理实现的AOP效果。
需要注意的是,由于JDK动态代理基于接口,因此如果你的目标类没有实现任何接口,那么JDK动态代理将无法使用。在这种情况下,你可以考虑使用CGLIB等第三方库来创建代理。
## 四、JDK动态代理原理分析
### 1、创建代理对象
对于匿名类方法中的实例,会在改类型为其生成相应的变量
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4c6611386d7043f4b6b4163754b9e1ca.png)
### 2、生成代理类
生成的代理对象继承了Proxy类,并实现了UserService接口。
* 接口
public interface UserService {
void test();
void getOne();
void getById();
}
* 接口实现类
import person.xsc.source.read.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void test() {
System.out.println(“hello world”);
}
@Override
public void getOne() {
}
@Override
public void getById() {
}
}
* 生成$proxy0类
import sun.misc.ProxyGenerator;
import java.io.FileOutputStream;
import java.io.IOException;
public class ProxyDemo {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
“$proxy0”, userService.getClass().getInterfaces(), 1);
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(“D:\myProject\spring-yuanma-fenxi\src\test\java\proxy\$proxy0.class”);
outputStream.write(proxyClassFile);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
* 展示$proxy0类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import person.xsc.source.read.service.UserService;
public class $proxy0 extends Proxy implements UserService {
private static Method m1;
private static Method m3;
private static Method m4;
private static Method m2;
private static Method m5;
private static Method m0;
public $proxy0(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final void test() throws {
try {
super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void getById() throws {
try {
super.h.invoke(this, m4, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void getOne() throws {
try {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)
66129f47b8a67243c1008edf79.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)