软件编程
位置:首页>> 软件编程>> java编程>> jdk * 源码分析过程

jdk * 源码分析过程

作者:yongan  发布时间:2023-03-01 05:05:59 

标签:jdk,动态,代理,源码,分析

代理对象的生成方法是:

Proxy.newProxyInstance(...) ,进入这个方法内部,一步一步往下走会发现会调用

ProxyGenerator.generateProxyClass() ,这个方法用来生成代理类的字节码。

下面通过调用 ProxyGenerator.generateProxyClass()方法在本地生成代理类。

1.首先要有一个接口

jdk * 源码分析过程

2.生成代理类的方法如下

jdk * 源码分析过程

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com