proxy

package
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package proxy 提供 AOP 动态代理实现,用于 enhance 框架。

该模块提供两种代理实现和代理工厂:

  • JdkDynamicProxy: 基于反射的 JDK 动态代理,支持接口代理
  • CglibProxy: 基于结构体嵌入的 CGLIB 代理,支持非接口方法
  • ProxyFactory: 代理工厂,统一创建代理对象

架构设计

  • Proxy: 代理接口,定义统一的调用方法
  • ProxyFactory: 代理工厂接口,负责创建代理对象
  • InvocationHandler: 调用处理器接口,定义方法拦截逻辑
  • JdkDynamicProxy: JDK 动态代理实现
  • CglibProxy: CGLIB 代理实现

使用方式

创建 JDK 动态代理:

handler := &MyInvocationHandler{}
proxy := proxy.NewJdkDynamicProxy(target, iface, handler)
result, err := proxy.Invoke(target, "MethodName", []any{arg1, arg2})

创建 CGLIB 代理:

handler := &MyInvocationHandler{}
proxy := proxy.NewCglibProxy(target, handler)
result, err := proxy.Invoke(target, "MethodName", []any{arg1, arg2})

使用代理工厂:

factory := proxy.NewProxyFactory(target)
factory.SetHandler(handler)
proxy := factory.CreateProxy()

设计模式

  • Proxy 模式:封装目标对象,控制方法访问
  • Factory 模式:统一代理对象创建
  • Chain of Responsibility:通过 InvocationHandler 实现调用链

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsCglibProxy

func IsCglibProxy(obj any) bool

IsCglibProxy 检查对象是否为 CglibProxy。

func IsJdkDynamicProxy

func IsJdkDynamicProxy(obj any) bool

IsJdkDynamicProxy 检查对象是否为 JdkDynamicProxy。

Types

type CglibProxy

type CglibProxy struct {
	// contains filtered or unexported fields
}

CglibProxy CGLIB 代理。

基于结构体嵌入实现的代理,支持非接口方法。 通过嵌入目标结构体并重写方法,实现 AOP 增强。

使用方式:

handler := &MyHandler{}
proxy := proxy.NewCglibProxy(&MyService{}, handler)
result, err := proxy.Invoke(target, "DoSomething", []any{arg1, arg2})

线程安全:是

func EnsureCglibProxy

func EnsureCglibProxy(obj any) (*CglibProxy, bool)

EnsureCglibProxy 确保对象是 CglibProxy。

返回值:

  • *CglibProxy: 代理实例
  • bool: 是否为 CglibProxy

func NewCglibProxy

func NewCglibProxy(target any, handler InvocationHandler, advisors ...aop.Advisor) *CglibProxy

NewCglibProxy 创建 CGLIB 代理。

参数:

  • target: 目标对象(必须是结构体指针)
  • handler: 调用处理器

返回值:

  • *CglibProxy: 代理实例

panic: 如果 target 不是结构体指针

func (*CglibProxy) AdvisedAdvisors

func (p *CglibProxy) AdvisedAdvisors() []aop.Advisor

AdvisedAdvisors 获取已应用的通知器列表。 实现 Proxy 接口。

func (*CglibProxy) GetHandler

func (p *CglibProxy) GetHandler() InvocationHandler

GetHandler 获取调用处理器。

func (*CglibProxy) GetMethod

func (p *CglibProxy) GetMethod(name string) (reflect.Method, error)

GetMethod 获取结构体方法(带缓存)。

查找指针接收者方法。

参数:

  • name: 方法名

返回值:

  • reflect.Method: 方法信息
  • error: 方法不存在时返回错误

func (*CglibProxy) GetTarget

func (p *CglibProxy) GetTarget() any

GetTarget 获取原始目标对象。

func (*CglibProxy) GetTargetType

func (p *CglibProxy) GetTargetType() reflect.Type

GetTargetType 获取目标类型。

func (*CglibProxy) Invoke

func (p *CglibProxy) Invoke(target any, method string, args []any) (any, error)

Invoke 调用代理方法。

通过反射查找结构体方法,并委托给 InvocationHandler 处理。

参数:

  • target: 目标对象
  • method: 方法名
  • args: 方法参数列表

返回值:

  • any: 方法返回值
  • error: 调用错误

func (*CglibProxy) InvokeMethod

func (p *CglibProxy) InvokeMethod(name string, args []any) (any, error)

InvokeMethod 直接通过反射调用结构体方法(不经过 handler)。

用于在 InvocationHandler 中调用原始方法。

参数:

  • name: 方法名
  • args: 方法参数列表

返回值:

  • any: 方法返回值
  • error: 调用错误

func (*CglibProxy) Target

func (p *CglibProxy) Target() any

Target 获取原始目标对象。 实现 Proxy 接口。

type InvocationHandler

type InvocationHandler interface {
	// Invoke 处理方法调用。
	//
	// 在目标方法调用前后执行自定义逻辑。
	// 必须调用 target 的实际方法(如果需要)。
	//
	// 参数:
	//   - target: 目标对象
	//   - method: 方法名
	//   - args: 方法参数列表
	//
	// 返回值:
	//   - any: 方法返回值
	//   - error: 调用错误
	Invoke(target any, method string, args []any) (any, error)
}

InvocationHandler 调用处理器接口。

定义方法拦截逻辑。在代理调用目标方法时,调用处理器可以:

  • 在方法执行前执行前置逻辑
  • 在方法执行后执行后置逻辑
  • 替换方法执行结果
  • 抛出异常阻止方法执行

类似于 java.lang.reflect.InvocationHandler。

type JdkDynamicProxy

type JdkDynamicProxy struct {
	// contains filtered or unexported fields
}

JdkDynamicProxy JDK 动态代理。

基于反射实现的动态代理,支持接口代理。 通过 InvocationHandler 拦截方法调用,实现 AOP 增强。

使用方式:

handler := &MyHandler{}
proxy := proxy.NewJdkDynamicProxy(target, handler)
result, err := proxy.Invoke(target, "DoSomething", []any{arg1, arg2})

线程安全:是

func EnsureJdkDynamicProxy

func EnsureJdkDynamicProxy(obj any) (*JdkDynamicProxy, bool)

EnsureJdkDynamicProxy 确保对象是 JdkDynamicProxy。

返回值:

  • *JdkDynamicProxy: 代理实例
  • bool: 是否为 JdkDynamicProxy

func NewJdkDynamicProxy

func NewJdkDynamicProxy(target any, iface reflect.Type, handler InvocationHandler, advisors ...aop.Advisor) *JdkDynamicProxy

NewJdkDynamicProxy 创建 JDK 动态代理。

参数:

  • target: 目标对象(必须实现 iface 指定的接口)
  • iface: 接口类型(通过 reflect.Type 传递)
  • handler: 调用处理器

返回值:

  • *JdkDynamicProxy: 代理实例

使用示例:

var svc TestService = &TestServiceImpl{}
proxy := proxy.NewJdkDynamicProxy(svc, reflect.TypeOf((*TestService)(nil)).Elem(), handler)

panic: 如果 target 或 iface 为 nil

func (*JdkDynamicProxy) AdvisedAdvisors

func (p *JdkDynamicProxy) AdvisedAdvisors() []aop.Advisor

AdvisedAdvisors 获取已应用的通知器列表。 实现 Proxy 接口。

func (*JdkDynamicProxy) GetHandler

func (p *JdkDynamicProxy) GetHandler() InvocationHandler

GetHandler 获取调用处理器。

func (*JdkDynamicProxy) GetIface

func (p *JdkDynamicProxy) GetIface() reflect.Type

GetIface 获取接口类型。

func (*JdkDynamicProxy) GetMethod

func (p *JdkDynamicProxy) GetMethod(name string) (reflect.Method, error)

GetMethod 获取接口方法(带缓存)。

参数:

  • name: 方法名

返回值:

  • reflect.Method: 方法信息
  • error: 方法不存在时返回错误

func (*JdkDynamicProxy) GetTarget

func (p *JdkDynamicProxy) GetTarget() any

GetTarget 获取原始目标对象。

func (*JdkDynamicProxy) Invoke

func (p *JdkDynamicProxy) Invoke(target any, method string, args []any) (any, error)

Invoke 调用代理方法。

通过反射查找接口方法,并委托给 InvocationHandler 处理。

参数:

  • target: 目标对象
  • method: 方法名
  • args: 方法参数列表

返回值:

  • any: 方法返回值
  • error: 调用错误

func (*JdkDynamicProxy) InvokeMethod

func (p *JdkDynamicProxy) InvokeMethod(name string, args []any) (any, error)

InvokeMethod 直接通过反射调用接口方法(不经过 handler)。

用于在 InvocationHandler 中调用原始方法。

参数:

  • name: 方法名
  • args: 方法参数列表

返回值:

  • any: 方法返回值
  • error: 调用错误

func (*JdkDynamicProxy) Target

func (p *JdkDynamicProxy) Target() any

Target 获取原始目标对象。 实现 Proxy 接口。

type Proxy

type Proxy interface {
	// Invoke 调用代理方法。
	//
	// 通过代理对象调用目标方法,拦截器会自动执行匹配的通知。
	//
	// 参数:
	//   - target: 目标对象
	//   - method: 方法名
	//   - args: 方法参数列表
	//
	// 返回值:
	//   - any: 方法返回值
	//   - error: 调用错误
	Invoke(target any, method string, args []any) (any, error)

	// Target 获取原始目标对象。
	Target() any

	// AdvisedAdvisors 获取已应用的通知器列表。
	AdvisedAdvisors() []aop.Advisor
}

Proxy 代理接口。

定义代理对象的核心行为。代理对象封装目标对象,控制方法访问。 所有代理实现都必须实现此接口,提供统一的调用方式。

type ProxyFactory

type ProxyFactory interface {
	// CreateProxy 创建代理对象。
	//
	// 根据目标对象类型自动选择代理实现。
	// 如果目标实现了接口,使用 JDK 动态代理;
	// 否则使用 CGLIB 代理。
	//
	// 参数:
	//   - target: 目标对象
	//   - handler: 调用处理器
	//
	// 返回值:
	//   - Proxy: 代理对象
	//   - error: 创建错误
	CreateProxy(target any, handler InvocationHandler) (Proxy, error)

	// CreateProxyWithAdvisors 创建带通知器的代理对象。
	//
	// 创建代理对象并应用指定的通知器列表。
	//
	// 参数:
	//   - target: 目标对象
	//   - handler: 调用处理器
	//   - advisors: 通知器列表
	//
	// 返回值:
	//   - Proxy: 代理对象
	//   - error: 创建错误
	CreateProxyWithAdvisors(target any, handler InvocationHandler, advisors []aop.Advisor) (Proxy, error)
}

ProxyFactory 代理工厂接口。

负责创建代理对象。根据目标对象的类型(接口或结构体), 自动选择最优的代理实现(JDK 动态代理或 CGLIB 代理)。

func NewProxyFactory

func NewProxyFactory() ProxyFactory

NewProxyFactory 创建默认代理工厂。

func NewProxyFactoryWithIface

func NewProxyFactoryWithIface(iface reflect.Type) ProxyFactory

NewProxyFactoryWithIface 创建指定接口的代理工厂。

type ProxyType

type ProxyType int

ProxyType 代理类型枚举。

const (
	// ProxyTypeJDK JDK 动态代理(基于接口)。
	ProxyTypeJDK ProxyType = iota

	// ProxyTypeCGLIB CGLIB 代理(基于类)。
	ProxyTypeCGLIB
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL