Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在实现java.security.Principal的类中围绕方法创建方面?_Java_Spring_Aspectj_Aop - Fatal编程技术网

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

如何在实现java.security.Principal的类中围绕方法创建方面?,java,spring,aspectj,aop,Java,Spring,Aspectj,Aop,有人知道如何在实现java.security.Principal接口的类中围绕方法“getName()”创建方面吗 我正在使用spring,下面是我的课程的相关部分: @Aspect public class MyPrincipalAspect { @PointCut("(execution(* java.security.Principal.getName(..)))") private void getNamePC(){} @Around("getNamePC()"

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

我正在使用spring,下面是我的课程的相关部分:

@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包加载time weave类的内容,但是他们说这仍然是可能的(但是,他们没有给出任何示例)

我还尝试了一种非Spring方法(使用一个aop.xml文件,其中javaagent在我的AppServer配置参数中定义)

非常感谢您的帮助


谢谢。

您有几种选择:

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

更新:哦,顺便说一下,在切入点中,您可能希望使用
Principal+
而不仅仅是
Principal
,以便拦截重写的方法。

您有几个选项:

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