当前位置: 首页 > 面试题库 >

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

郝修为
2023-03-14
问题内容

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

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

除了实现包装器类之外,还有其他方法可以将所有调用委派给成员(成员是MyClass的实例或使用AOP进行支持)吗?


问题答案:

如您所述,您不能使用JDK动态代理(无接口),但是使用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"


 类似资料:
  • 问题内容: 我正在尝试打印“你好,AOP!” 当Guice / AOP联盟拦截标有特定(自定义)注释的方法时,将显示一条消息。我按照官方的文档(可以找到一个PDF 这里 - 。AOP方法拦截的东西在第11页 ),它不能去工作,只编译。 首先,我的注释: 然后,我的实现: 接下来,我的方法拦截器: 最后,尝试利用所有这些AOP内容的驱动程序: 当我运行这个小小的测试驱动程序时,我得到的唯一控制台输出

  • 我试图让aspectj拦截带注释的方法: 我删除了!为了简洁起见,在(InterceptMeAspect)内,但它并没有拦截太多。如果我删除注释约束(在(@InterceptMe*)内),它可以工作,但会拦截所有内容,这会造成一个大问题。 输出字节码似乎有完整的注释,所以我希望注释标准匹配。我正在或试图进行编译时编织。这很重要,因为我有另一个方面确实使用上面相同的方法工作。我怀疑该方面正在搞乱这个

  • 我正在尝试使用来做同样的事情,现在我使用哪个注释来捕获相关的对象,切入点表达式应该是什么?我尝试了,但这是一个void方法,如何捕获该方法的参数?我是AOP的初学者,所以如果这个问题太琐碎,请原谅。 解决方案:使用spring AOP获取方法参数?

  • 问题内容: 我有这个代码 有什么方法可以在没有子类化或修改类且没有工厂的情况下拦截呼叫? 编辑:抱歉忘了提到这是在Android平台上。 问题答案: 您是否考虑过面向方面的编程,甚至还考虑过AspectJ?有关AspectJ / Android的信息,请参见此处和此处。

  • 我想用Criterias执行这个查询,但它似乎没有按预期工作: 我试过这个 但是它返回一个结果,就像我在执行这个查询一样 它只返回列描述。 我的问题是,如何告诉Hibernate我想要表中的所有列,但我不想重复Description列中的变量?