jdk * 源码分析过程
作者:yongan 时间:2023-03-01 05:05:59
代理对象的生成方法是:
Proxy.newProxyInstance(...)
,进入这个方法内部,一步一步往下走会发现会调用
ProxyGenerator.generateProxyClass()
,这个方法用来生成代理类的字节码。
下面通过调用 ProxyGenerator.generateProxyClass()方法在本地生成代理类。
1.首先要有一个接口
2.生成代理类的方法如下
3.将生成的代理类导入到idea中查看是长这样
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import com.example.springboottest.config.OrderService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
protected static class $OrderService extends Proxy implements OrderService {
private static Method m1;
private static Method m3;
private static Method m2;
private static Method m0;
public $OrderService(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 query() throws {
try {
super.h.invoke(this, m3, (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 int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m3 = Class.forName("com.example.springboottest.config.OrderService").getMethod("query");
m2 = Class.forName("java.lang.Object").getMethod("toString");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}
可以发现在代理类中的构造方法中传入了我们实现的InvocationHandler,在调用方法时会回调invoke方法。
还可以发现代理类中继承了Proxy,由于java中是单继承的,所以java * 是针对接口的。
来源:https://www.cnblogs.com/yongan/p/11098326.html
标签:jdk,动态,代理,源码,分析
0
投稿
猜你喜欢
解读在C#中winform程序响应键盘事件的详解
2023-10-08 09:17:00
Java语言实现简单FTP软件 FTP协议分析(1)
2023-11-10 17:57:21
SpringBoot如何使用Fastjson解析Json数据
2023-11-25 11:55:58
java.sql.Date和java.util.Date的区别详解
2023-11-28 16:15:09
Asp.Net中避免重复提交和弹出提示框的实例代码
2022-10-01 19:57:26
android实现蓝牙app代码
2021-07-08 07:52:15
基于WPF实现验证码控件
2021-08-15 21:44:36
Spring Security基于JWT实现SSO单点登录详解
2022-02-28 10:56:55
C#实现的SQL备份与还原功能示例
2021-09-03 17:53:17
Android实现点击某个按钮指定位置弹出布局
2023-04-10 16:09:59
关于C#调用C++dll传指针释放内存问题
2021-12-20 06:56:34
Spring注解之@Lazy注解使用解析
2023-08-28 23:12:23
举例讲解Java中synchronized关键字的用法
2023-07-01 22:20:19
C#中Socket通信用法实例详解
2022-07-10 03:42:03
SpringBoot整合liquibase及liquibase生成初始化脚本的方式
2023-07-29 11:53:18
C# 实现FTP客户端的小例子
2022-06-09 13:19:13
Android编程实现下载时主界面与详细界面一致更新的方法
2023-01-02 10:07:35
C#实现封面图片生成器的示例代码
2023-05-15 11:05:58
Spring Boot 2.X快速整合jpa过程解析
2021-09-22 15:27:29
Spark学习笔记之Spark中的RDD的具体使用
2023-07-05 04:49:44