Java基础学习 JDK动态代理

    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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

66129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值