如何在方面内使用 ajc 构建参数?

2023-12-07

我需要知道方面内 .jar 的名称,以便我可以通过 @DeclareParents 创建一个字符串字段。

我知道我可以将内容传递给 ajc 编译器,但实际上是否可以使用方面传递的参数? 最终结果应该是带有附加字段的类,其中包含我的 .jar 的名称作为值。

UPDATE:测试建议。 Gson.jar 是类路径上的 .jar

    InputStream r = Gson.class.getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
    String x = getString(r);
    System.out.println(x);

Output:

Manifest-Version: 1.0

Name: org/aspectj/lang/
Specification-Title: AspectJ Runtime Classes 
Specification-Version: 1.7
Specification-Vendor: aspectj.org
Implementation-Title: org.aspectj.tools
Implementation-Version: 1.7.3
Implementation-Vendor: aspectj.org
Bundle-Name: AspectJ Runtime
Bundle-Version: 1.7.3
Bundle-Copyright: (C) Copyright 1999-2001 Xerox Corporation, 2002 Palo 
  Alto Research Center, Incorporated (PARC), 2003-2009 Contributors. 
  All Rights Reserved.

似乎同时只能有一个 MANIFEST.MF 资源,而 AspectJ.jar 恰好位于类路径上的第一个。


我不知道有什么办法可以做你想做的事。即使可能,如果您解压 JAR 并从文件系统加载修改后的类或重新打包/重命名 JAR,字符串值仍然是相同的。解决方案将是静态的,而不是动态的。

不管怎样,如何将这样的信息放入打包到 JAR 中的配置文件中,或者甚至直接放入清单文件中? Maven 能够向清单添加信息,Java 可以在运行时读取它们。我还没有想清楚,更不用说尝试实施类似的事情了,但也许这是你可以走的一条路。

请随时提出后续问题。


Update:您可以避免使用清单方法并尝试直接确定每个加载的类的 JAR 文件,另请参阅这个答案.

实用类:

package de.scrum_master.util;

import java.net.URL;

public class ClassFileHelper {
    public static URL getClassURL(Class<?> clazz) {
        return clazz.getResource('/' + clazz.getName().replace('.', '/') + ".class");
    }

    public static String getJARFromURL(URL url) {
        if (!url.getProtocol().equals("jar"))
            return null;
        String fileName = url.getFile();
        fileName = fileName.substring(0, fileName.lastIndexOf('!'));
        fileName = fileName.substring(fileName.lastIndexOf('/') + 1);
        return fileName;
    }
}

Usage:

我在 Java + AspectJ 项目中尝试了这一点,其中方面包装在 JAR 文件中,Java 文件存储在文件系统目录中。我刚刚将以下建议添加到 JAR 中的一个方面:

before() : execution(public static void main(..)) {
    try {
        Class<?>[] classes = { String.class, this.getClass(), Class.forName("com.BadReader") };
        for (Class<?> clazz : classes) {
            System.out.println(clazz);
            URL classURL = ClassFileHelper.getClassURL(clazz);
            System.out.println(classURL);
            System.out.println(ClassFileHelper.getJARFromURL(classURL));
            System.out.println();
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

如您所见,该数组包含

  • JRE 引导类(String),
  • 方面类本身(this.getClass()),
  • 来自 JAR 外部 Java 项目的类 (Class.forName("com.BadReader")).

控制台输出:

class java.lang.String
jar:file:/C:/Programme/Java/jre7/lib/rt.jar!/java/lang/String.class
rt.jar

class com.SafeReaderAspect
jar:file:/C:/Users/Alexander/Documents/java-src/SO_AJ_ITD2StepCompilation_AspectJ/aspectLib.jar!/com/SafeReaderAspect.class
aspectLib.jar

class com.BadReader
file:/C:/Users/Alexander/Documents/java-src/SO_AJ_ITD2StepCompilation_Java/bin/com/BadReader.class
null

这是你想要的吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在方面内使用 ajc 构建参数? 的相关文章

  • 项目展开时自动调整列大小

    在具有多列的树中 如何在展开 折叠和数据更新时调整列的大小以适应内容 类似的解决方案表格问题 https stackoverflow com questions 3186340 swt table auto resize all colum
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 selenium 和 junit 测试多个浏览器(版本)

    我刚刚发现了硒 一个很棒的工具 我计划运行 使用 selenium ide 生成的 junit4 代码 但我需要它与许多浏览器 网络驱动程序一起运行 这个用例有 junit java 模式吗 我的第一个想法是使用 RunWith Param
  • 使用具有不同参数的 Jackson for List 将 JSON 映射到 pojo

    JSON 格式 0 cast showname woh pagle type Episodes video src video mp4 DRM False 这里的问题是我遇到以下异常 org codehaus jackson map Jso
  • 在 IntelliJ IDEA 中编辑并继续?

    使用 IntelliJ IDEA 社区版进行调试时是否可以编辑一些代码 我在选项中找不到这个功能 是的 这就是所谓的 热插拔 您可以在调试过程中编译修改后的代码 并且类文件将被替换 直到您停止调试 确保在调试器设置中启用 HotSwap 选
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • Jenkins 中未找到 Maven

    我正在 Jenkins 中运行我的 Maven Spring 项目 只是第一次测试它 使用 shell 脚本选项 mvn spring boot run 我收到构建错误 Users Shared Jenkins tmp jenkins808
  • 使用 Java Google App Engine 批量加载程序将整个数据存储区下载到一个 csv 文件

    我目前正在使用 kind参数来指定下载的类型和 filename指定要生成的 csv 文件的名称 这 rps limit bandwidth limit and batch size用于加速下载 例如 要下载我正在使用的游戏类型 appcf
  • 如何同时运行两个FOR循环

    我正在使用加速度计 第一个代码是振动检测器 代码1 if sensor SensorManager SENSOR ACCELEROMETER long curTime System currentTimeMillis long now Sy
  • Java:如何实现通用二叉搜索树?

    到目前为止 我一直在编写一个 Node 类 class Node private value private Node left private Node right public int getValue return value pub
  • 如何在同一行实例化对象并调用setter?

    如果我有一个Employee具有默认构造函数的类 private String firstName public Employee 和一个二传手 public void setFirstName String firstName this
  • Apache PDFBox 旋转 PDImageXObject

    我正在使用 2 0 0 SNAPSHOT 我想将页面设置为横向并旋转我的图片 所以我已经做到了page setRotation 90 使用 PDFBox 和 AffineTransform 似乎存在错误 这段代码没有做任何我期望的事情 Af
  • 为什么 CompletableFuture.allOf 声明为 CompletableFuture

    Why is CompletableFuture allOf声明为CompletableFuture
  • Java 中使用 PBKDF2 进行密码验证

    我正在用 Java 进行基于密码的文件加密 我使用 AES 作为底层加密算法PBKDF2WithHmacSHA1使用以下代码从盐和密码组合中派生密钥 我从本网站上的另一位慷慨的海报获得 SecretKeyFactory f SecretKe
  • 将 JVM 参数放入要在运行时获取的文件中

    我正在构建当前应用程序的 jar 它需要设置几个 JVM 参数 有没有办法在文件中而不是在命令行上设置这些 JVM 参数 我已经做了一些搜索 看起来我可以使用 java properties 文件做一些事情 可能通过设置 java args
  • JShell 如何查找变量或结果的类型

    如何在 JShell 中查找变量或表达式结果的类型 正在尝试 Java 中的按位运算符 jshell gt byte b 5 lt lt 1 Error incompatible types possible lossy conversio
  • 客户端和服务器之间的安全连接

    我正在开发一个服务器组件 它将为嵌入式客户端的请求提供服务 这也在我的控制之下 现在一切都是测试版 安全性是这样的 客户端通过 https 发送用户名 密码 服务器返回访问令牌 客户端使用自定义标头中的访问令牌通过 http 发出进一步请求
  • 如何在mockito中模拟Spring依赖

    我正在尝试嘲笑 Spring Beans 我能够模拟对象 B 和 C 但无法模拟 B 类内的对象 插入类 A 中的模拟包含 B 但 X 和 Y 为空 即使我嘲笑了它们 Mockito 有没有办法模拟 Spring bean 中成员的对象 N
  • Hibernate 对于 Android 应用程序来说是一种杀伤力吗? [复制]

    这个问题在这里已经有答案了 我正在为我的 Android 应用程序寻找一个好的 ORM 乍一看似乎对于移动设备我更喜欢使用更简单的东西 问题是我只是在这里假设 没有真正的证据 所以我想我应该询问社区的意见 也许有人有过这样的经历 它是一个相
  • 为什么 java.io.File 没有 close 方法?

    While java io RandomAccessFile确实有一个close method java io File没有 这是为什么 文件在完成时会自动关闭吗 javadoc 的Fileclass 将该类描述为 文件和目录路径名的抽象表

随机推荐

  • 是否可以从 Spring 应用程序属性中获取自定义对象?

    是否可以从 application yaml 获取自己的对象并将其与 Value 绑定到我的组件 Model Data public class CurrencyPlan private String id private String b
  • PHP 提交后保留选择选项

    我有一个 html 选择框 其中包含国家 地区列表 当我选择一个时 它会毫无问题地发送到 PHP 方法 但选择框会重置到顶部 如何保留用户在此处选择的值 我的代码在这里 为了简洁起见 我已经删除了大多数其他国家 地区
  • 在arm-linux中打印堆栈跟踪

    我按照这篇文章打印堆栈跟踪当我的 gcc C 应用程序崩溃时如何生成堆栈跟踪 它在 x86 linux 上运行良好 谁能教我如何让它在arm linux上运行 我使用的是arm linux gcc 4 4 3 root FriendlyAR
  • 使用 Sinatra 更改 HTTP 状态消息

    我正在编写一个简单的 Sinatra 应用程序 并且给定用户发布包含特定数据的请求 我想返回错误 453 自定义错误代码 以及消息 CLIENT ERROR 或类似的内容 问题是 查看 Sinatra 文档并进行一些测试 我找不到设置响应错
  • 如何检测鼠标指针是否击中 HTML 5 画布上已绘制的线条

    我试图弄清楚如何使用 jQuery 检测用户的鼠标是否点击了 HTML 5 画布上的一行 这是生成画布线的代码
  • R 中的空间自相关分析 (Global Moran's I)

    我有一个点列表 我想使用 Moran s I 并通过将感兴趣的区域除以 4 x 4 样方来检查自相关性 现在我在谷歌上找到的每个例子 例如http www ats ucla edu stat r faq morans i htm 使用某种测
  • 噩梦 JS 不工作

    我知道问题的标题看起来很模糊 但仅此而已 我在我的生产服务器上安装了nodejs 其中phantomjs工作正常 然后我通过安装了噩梦npm install nightmare 我可以在node modules中看到它 我尝试了开发人员在g
  • 如何在选择时突出显示菜单项? [复制]

    这个问题在这里已经有答案了 如何在选择时突出显示菜单项 我尝试使用各种属性修改 styles xml 例如colorPressedHighlight colorActivatedHighlight等 有没有办法让菜单项保持焦点 直到选择其他
  • 在脚本仍在执行时显示结果

    现在为了看到结果 我必须等到整个代码执行完毕 它会挂起直到完成并保持加载状态 一旦完成 它就会显示我正在寻找的所有信息 在脚本仍在运行时是否有办法显示此信息 所以说 如果我在代码顶部的某个地方有一个打印 我希望它在调用时显示 而不是在脚本执
  • 更新 imageView swift 4 的高度约束时无法同时满足约束

    我有一个stack view如下图所示 所以我改变了高度image以编程方式使其适合从我的服务器下载的图像 如果没有图像 则高度限制image将设置为零 这是我这样做的代码 let imageUrl URL string imageStri
  • 查找 CSV 文件/Pandas Dataframe 中标题行的行号

    我正在尝试获取 CSV 文件中包含标题的行的索引或行号 问题是 标题行可以根据我们系统的报告输出上下移动 我无法控制更改此设置 code ht pd read csv file csv test ht get loc Code Code b
  • 如何使用实体框架核心更新与普通 SQL 更新查询相同的多条记录列表?

    通常在 SQL 中我们可以写这样的查询UPDATE users SET isAdult 1 WHERE age gt 18 我想对实体框架核心中满足某些条件的所有行进行一些编辑 我写了这段代码 但出现错误 List
  • tomcat 中基于 JSP Web 应用程序表单的身份验证

    我已将我的应用程序配置为使用基于表单的身份验证 并在 server xml 中设置所需的设置 当我尝试访问受保护的页面时 我被正确重定向到登录页面 在登录页面上 我提供了正确的用户名和密码 但它没有让我登录 而是显示登录错误页面 我正在使用
  • password_hash 每次返回不同的值

    我正在制作一个登录系统 我想对密码进行哈希处理以使其更安全 但它每次都会返回不同的哈希值 甚至无法使用password verify 进行验证 这是我的代码 password password hash password4 PASSWORD
  • 让用户上传并运行Javascript有哪些风险

    如果您有一个 HTML5 游戏厅 允许用户上传一个使用 HTML5 和 Javascript 运行游戏的脚本 假设您的输入没有过滤器 除了只允许 JS 和 HTML 那么潜在的安全风险是什么 陷阱 一种不太可能的可能性是 如果游戏很受欢迎
  • 内部服务器错误

    我在远程服务器上的同一文件夹中有一个 HTML 文件和一个 PHP 文件 从 URL 中 我调用 HTML 文件 而 HTML 文件在提交表单时调用 PHP 文件 但进展并不顺利 当我提交表单时 它显示错误 500内部服务器错误 您要查找的
  • 如何使用 MapReduce API 在映射到云存储之前过滤数据存储数据?

    关于代码实验室here 我们如何在 MapReduce 作业中过滤数据存储数据 而不是获取特定实体类型的所有对象 在下面的映射器管道定义中 唯一的一个输入读取器参数是要处理的实体类型 我在 InputReader 类中看不到可以提供帮助的类
  • Selenium Python:如何网络抓取元素文本

    我正在尝试从轮盘赌游戏中抓取数据 在努力的同时 find element by class name roulette round result position text 我得到这个输出
  • 如何拆分 git repo 并应用 Maven 子模块和 Maven 父模块?

    我需要一些关于如何配置多个存储库的建议 以便它们共享 Maven 父级 并且还配置为 Maven 根项目中的子模块 我正在维护开源项目简单的Java邮件由于可选功能变得越来越大 我计划将项目分成子模块 每个子模块都有自己的 GIT 存储库
  • 如何在方面内使用 ajc 构建参数?

    我需要知道方面内 jar 的名称 以便我可以通过 DeclareParents 创建一个字符串字段 我知道我可以将内容传递给 ajc 编译器 但实际上是否可以使用方面传递的参数 最终结果应该是带有附加字段的类 其中包含我的 jar 的名称作