java - 如何拦截具有标准 Java 功能(无 AspectJ 等)的方法调用?

标签 java reflection methods

我想拦截对某个类 MyClass 的所有方法调用,以便能够对某些 setter 调用使用react。

我尝试使用动态代理,但据我所知,这仅适用于实现某些接口(interface)的类。但是MyClass没有这样的接口(interface)。

除了实现一个包装类之外,还有没有其他方法可以将所有调用委托(delegate)给一个成员,该成员是 MyClass 的一个实例,或者除了使用 AOP 之外?

最佳答案

如您所述,您不能使用 JDK 动态代理(无接口(interface)),而是使用 Spring和 CGLIB(Spring 附带的 JAR),您可以执行以下操作:

public class Foo
{
    public void setBar()
    {
        throw new UnsupportedOperationException("should not go here");
    }

    public void redirected()
    {
        System.out.println("Yiha");
    }
}

Foo foo = new Foo();
ProxyFactory pf = new ProxyFactory(foo);

pf.addAdvice(new MethodInterceptor()
{
    public Object invoke(MethodInvocation mi) throws Throwable
    {
        if (mi.getMethod().getName().startsWith("set"))
        {
            Method redirect = mi.getThis().getClass().getMethod("redirected");
            redirect.invoke(mi.getThis());
        }
        return null;
    }
});

Foo proxy = (Foo) pf.getProxy();
proxy.setBar(); // prints "Yiha"

关于java - 如何拦截具有标准 Java 功能(无 AspectJ 等)的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576918/

相关文章:

java - 使用反射动态保存一个类中的所有字段? ("<FieldName>","<FieldValue>")

reflection - 反射到底是什么,什么时候是一个好方法?

python - 静态方法语法困惑

java - 如何在触发类内部对象的事件时调用类上的方法

java - SOAP 规范化变换

c# - 在 C# 中访问实例级自定义属性

java - 在 GUI 上切换 'always on top'

c# - C# 静态方法模板

java - 代码不在 switch 语句内执行

java - 如何在beans.xml中使用@JsonPropertyOrder注释