JavaSE-动态代理

学习动态代理原理是为以后理解框架而必须的
需要注意的点:

接口:java.lang.reflect.InvocationHandler

方法:java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

重写方法:invoke

以下是有接口的情况,使用JDK代理(没有接口的情况使用CGLIB动态代理)

package com.du.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// ①==================基于Java接口实现动态代理==========================
class Proxyer implements InvocationHandler{
// 被代理对象
private Object o;
// 确定被代理对象
public Proxyer(Object o) {
this.o = o;
}
/**
* 类加载器
* 得到被代理对象的接口
* 代理对象实体类
* @return
*/
// 确定代理对象的实例
public Object bind(){
return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理之前执行的辅助方法!");
Object result=method.invoke(o, args);
System.out.println("代理之后执行的辅助方法!");
return result;
}
}
// ②==================被代理的业务==========================
interface Service{
void doService();
}
// ③===================被代理对象=========================
class Obj implements Service{
@Override
public void doService() {
System.out.println("主要执行的核心业务");
}
}
// ④===================测试执行=========================
public class MainTest{
public static void main(String[] args) {
Obj obj = new Obj();
Proxyer proxyer = new Proxyer(obj);
Service b = (Service) proxyer.bind();
b.doService();
}
}
代理之前执行的辅助方法!
主要执行的核心业务
代理之后执行的辅助方法!
posted @   生生灯火半杯月  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示