java - 如何使用命令行将切入点附加到驻留在 .jar 文件内的类的方法?

标签 java jar aspectj aspect

我是 AOP 新手。我在 HookShow.java 文件中创建了一个类:

public class HookShow
{
        void show(String msg)
        {
            System.out.println("In show :"+msg);
        }
        public static void main(String[] args)
        {
            HookShow cm=new HookShow();
            cm.show("called from main method");

        }
}

然后我编译它并使用以下方法将生成的 .class 文件添加到 .jar 文件中:

jar cf HSHOW.jar HookShow.class

现在我有了一个 HSHOW.jar。现在我正在创建一个切面,该切面在调用 show() 时执行。但我不知道如何引用该 jar 文件中的类和方法。 以下是我的方面文件:

public aspect AspectHookShow
{
   pointcut changemsgPointcut( String str) :execution(void HookShow.show(String)) && args(str);

   before(String str ) : changemsgPointcut( str)
   {
      System.out.println("inside pointcut :"+str);
   }    
}

所以请有人告诉我如何引用我的 jar 文件中类内的方法。

最佳答案

经过 3 个小时的研究,我找到了 3 种方法来实现上述目标,好处是我不必对代码进行太多更改,我只需要在 cmd 提示符下执行一些命令即可:

第一种方法:

我从 Oreilly AspectJ Cookbook 中得到了一种方法:

步骤: 1:使用传统的javac命令编译HookShow类:

javac HookShow.java

2:将生成的HookShow.class文件打包成名为MyApp.jar的.jar文件:

jar -cvf MyApp.jar HookShow.class

3:使用ajc命令编译AspectHookShow.java切面,在命令行上使用-inpath选项指定新的MyApp.jar:

> ajc -inpath MyApp.jar AspectHookShow.java

-inpath 选项强制 ajc 编译器将 Java 字节代码从提供的 .jar 文件提取到 -d 选项指定的目标目录中。然后,ajc 编译器将提取的字节代码包含在方面编织过程中。

4:如果在使用 ajc 编译期间没有出现错误,那么您将成功地将 MyApp.jar 文件中包含的类与 AspectHookShow 方面编织在一起。由于 ajc 命令从提供给 -inpath 选项的 .jar 文件中提取类,因此运行应用程序不再需要它们。但是,您可以选择在运行 ajc 命令时使用 -outjar 选项将新应用程序重新打包到自己的 .jar 文件中:

> ajc  -inpath MyApp.jar -outjar MyAspectOrientedApp.jar AspectHookShow.java

这会生成一个 MyAspectOrientedApp.jar,其中包含应用程序的方面和类,然后可以使用传统的 java 命令运行它们:

> java -classpath MyAspectOrientedApp.jar HookSHow

第二种方式:

执行以下命令:

>ajc -janars aspectjrt.jar ;HSHOW.jar AspectHookShow.java -outjar Final.jar

这将创建 Final.jar。然后我把这个 jar 放在我的类路径中,现在我可以在任何类中使用它。

希望它对像我这样的人有用。

关于java - 如何使用命令行将切入点附加到驻留在 .jar 文件内的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22298945/

相关文章:

java - Spring Security Login with a twist : users must activate their account before login

java.lang.UnsatisfiedLinkError : dalvik. system.PathClassLoader[DexPathList

java - 如何从 Maven 项目创建独立的 jar?

java - MQTT v1.0.2 jar

java - 使用 Aspectj 时可以在 args 中使用我自己的对象吗?

java - 如何初始化自定义类对象数组?

java - css 表达式不适用于 primefaces

java - Jar 到 Exe - 未找到主类

java - @Around建议没有被触发

gradle - 截至2018-06年,AspectJ是否有正式的Gradle插件?