gpt4 book ai didi

java - 如何围绕实现 java.security.Principal 的类中的方法创建切面?

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:40 28 4
gpt4 key购买 nike

有谁知道如何在实现 java.security.Principal 接口(interface)的类中围绕方法“getName()”创建方面?

我正在使用 spring,下面是我的类(class)的相关部分:

@Aspect
public class MyPrincipalAspect {
@PointCut("(execution(* java.security.Principal.getName(..)))")
private void getNamePC(){}

@Around("getNamePC()")
public Object getNameJP(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = pjp.proceed();
return retVal;
}
}

我实际上想用“retVal”做一些事情,但是,我只是使用上面作为一个简单的例子。我的应用程序中有其他方面,它们都工作得很好。

我在 AspectJ 网站上读到一些关于无法从 java 包加载时编织类的内容,但他们说这仍然是可能的(但是,他们没有给出任何示例)。

我还尝试过非 Spring 方法(使用 aop.xml 文件以及在我的应用程序服务器配置参数中定义的 javaagent)。

非常感谢任何帮助。

谢谢。

最佳答案

您有多种选择:

  • 如果您可以控制调用 getName 的客户端类,则可以使用 call 切入点而不是执行。这样您就不需要编写任何 JDK 类。
  • 如果你想要拦截的Principal子类不是JDK,而是第三方类(你没有提到),你可以在编译或加载时轻松编织它们。
  • 如果您确实需要编织 JDK/JRE 类,请在现有类文件中使用编译时编织,并在输出目录中创建新的编织文件。然后用它们替换原来的 JDK/JRE 类,将它们复制到默认位置。只要您可以控制运行时环境,这对于调试来说应该足够了,甚至对于生产使用来说也应该足够了。
  • 也许(我不知道,因为我没有尝试过)有一种方法可以编写一个类加载器,它会首先加载运行时编织器类,但它听起来不太可能或不像一个简单的选项。我必须自己进行网络搜索或进行一些编码实验才能找到答案。

更新:哦,顺便说一句,在你的切入点中,你可能想使用 Principal+ 而不仅仅是 Principal 来拦截重写的方法。

关于java - 如何围绕实现 java.security.Principal 的类中的方法创建切面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6669077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com