jdk * 源码分析过程
作者:yongan 发布时间:2023-03-01 05:05:59
标签:jdk,动态,代理,源码,分析
代理对象的生成方法是:
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


猜你喜欢
- 引言 基于生成图片实现了一个手机号转图片的需求。 内容也很简单,直接
- 以下弹出框是框的实现,放入到SWT项目下就可运行。1.提示框MessageBox mb = new MessageBox(shell,SWT
- 这篇文章主要介绍了基于Java检查IPv6地址的合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。
- C# 反射(Reflection)反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。
- 本文实例为大家分享了Android实现手势密码功能的具体代码,供大家参考,具体内容如下首先声明一下,九宫格布局是从网上扒了一个大神写好的,大
- Spring Security简介:Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块
- RestAPI中, 经常需要操作json字符串, 需要把json字符串"反序列化"成一个对象, 也需要把一个
- __intSumintSum 函数可用于计算两个或多个整数值的总和。引用名称是可选的, 但它不能是有效的整数。{__intSum(2,5,M
- 目录一:spring读取配置或注解的过程二:spring的bean的生命周期2.1:实例化 Instantiation2.2:初始化3: 使
- 最近开发项目中,有个在屏幕上任意拖动的悬浮窗功能,其实就是利用 WindowManager的api来完成这个需求,具体的实现的功能如下:1.
- 需求:当时间在凌晨0点至0点5分之间程序不执行。也就是实现判断当前时间点是否在
- 在网上看到一个进度条效果图,非常美观,如下:进行效果分解:1.渐变色,看起来颜色变化并不复杂,使用LinearGradient应该可以实现。
- 本文实例讲述了Android数据库中事务操作方法之银行转账功能。分享给大家供大家参考,具体如下:主javapackage com.ithei
- 在学习 Spring Mvc 过程中,有必要来先了解几个关键参数:@Controller:在类上注解,则此类将编程一个控制器,在项目启动 S
- Android 有两种方式可以设置全屏.第一种方式:在protected void onCreate(Bundle savedInstanc
- 本文实例为大家分享了java库存管理系统的具体代码,供大家参考,具体内容如下模拟真实的库存管理逻辑,完成超市管理系统的日常功能实现。经过分析
- 本文为大家分享了CountDownTimer模拟短信验证倒计时的具体代码,供大家参考,具体内容如下内容:介绍倒计时CountDownTime
- 新建工程,新建Module新建一个工程,之后按下图中的操作方式,创建一个Module创建 Android Library选中 Android
- 本文分析了Android中EditText光标在4.0中的bug及解决方法。分享给大家供大家参考,具体如下:一、问题:不知道为什么,我的Ed