AspectJ - 匹配具有通用参数的方法的切入点

2024-04-30

我有一个接受任何类型作为其参数的通用方法。
例如,我想要一个切入点,它与仅以“String”类型作为参数的方法的调用相匹配。最终的要求是将建议执行的范围限制为“字符串”参数。

这是我的通用类和方法:

public class Param<T> {
    public T execute(T s){
        return s;
    }
}

主类:我的应用程序以布尔值和字符串作为参数调用该方法。

public static void main(String[] args) {
    Param<String> sp = new Param<String>();
    String rs = sp.execute("myString"); //want a joint point

    Param<Boolean> bp = new Param<Boolean>();
    Boolean rb = bp.execute(true); //dont want a joint point
}

下面的切入点对于字符串和布尔参数都有效(实际上适用于任何类型)。但我想要一个切入点,仅当参数为 String 类型时才拦截方法调用。

@Pointcut("call(* com.amazon.auiqa.aspectj.generics.Param.execute(**))")
void param(){}

@Pointcut("execution(Object com.amazon.auiqa.aspectj.generics.Param.execute(Object))")
void param(){}

以下内容对我不起作用:

 @Pointcut("execution(String com.amazon.auiqa.aspectj.generics.Param.execute(String))")
 @Pointcut("call(String com.amazon.auiqa.aspectj.generics.Param.execute(String))")

我想知道是否有可能在这里实现我想要实现的目标。我想对方法返回类型做同样的事情。


您无法使用 AspectJ 或任何其他字节码操作库来执行此操作,因为泛型类型信息实际上会从编译的字节码中删除(从 Java 9 开始),因此您的泛型方法将变为public Object execute(Object s),因为类型参数T是无界的。看类型擦除 https://docs.oracle.com/javase/tutorial/java/generics/erasure.html有关详细信息,请参阅 Java 文档。

虽然原始方法签名以元数据的形式保留,但编译器可以在针对泛型代码进行编译时检查是否遵守类型边界,但这不会以任何方式帮助您确定该类的实例的泛型类型参数被实例化,因为该信息根本不存在。

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

AspectJ - 匹配具有通用参数的方法的切入点 的相关文章

  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • 检查 IPv4 地址是否在私有范围内

    在 Python 中 使用 IPy 模块您可以执行以下操作 gt gt gt ip iptype PRIVATE 有没有一个库或简单的方法可以在 Java 中执行相同的操作 似乎不完全是但是InetAddress有一些 isXX 方法 例如
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • Kotlin 中扩展函数的多态性

    我有几个我无法控制的课程 我已经在几个常见的 属性 上创建了几个同名的扩展方法 名称相同的扩展函数始终返回相同的值类型 尽管针对每种类型的接收器以不同的方式计算 这里有一个简化的基于仅一个属性的内置类型的示例 DOES NOT COMPIL
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外

随机推荐

  • Embeddable、Hibernate 中的多对一关系

    我有一个场景Embeddablehibernate 中的类使用Entity 根据我在SO和其他链接上找到的各种答案 我们可以写 ManyToOne OneToMany里面一个Embeddable class 但这样做让我HibernateM
  • 用 Python 重复读取 CSV?

    我正在尝试根据我已有的 csv 检查提取的数据的值 它只会循环遍历 CSV 的行一次 我只能检查 feed items 的一个值 我需要在某处重置某个值吗 有没有更好 更有效的方法来做到这一点 谢谢 orig csv reader open
  • 如何在 Visual Studio 代码中切换文本大小写

    如何在 Visual Studio Code 中切换突出显示文本的大小写 VS 通过 CTRL SHIFT U 和 CTRL U 允许这样做 是否有一个命令绑定可以设置来执行此操作 或者默认情况下是其他组合键 Echoing 只是另一个开发
  • 正则表达式匹配时间

    我希望我的用户能够输入时间表单 如果需要更多信息 用户用它来表示完成任务需要多少时间 如果填满 它将保存在数据库中 这是我所拥有的 0 1 0 9 2 0 4 0 5 0 9 0 5 0 9 它匹配空表单或 01 30 和 01 30 00
  • 如何使用PIL读取原始图像?

    我有一个原始图像 其中每个像素对应一个 16 位无符号整数 我正在尝试使用 PIL Image fromstring 函数进行读取 如以下代码所示 if name main if len sys argv 4 print Error mis
  • 我可以停止 CakePHP 获取查询的所有行吗?

    我正在使用 CakePHP 和 modelName gt find 调用选择相当多的行 可能是数百行 通常 在 PHP MySQL 中这当然不会成为问题 因为您在 while 循环中获取它们 但是 CakePHP 将所有行加载到一个数组中
  • 标准化设备坐标

    我正在编写一个处理 2D 图形形状的库 I m just wondering why should my coordinate system range from 1 1 for both the x and y axis instead
  • Angular 6:i18n:如何更新已翻译的现有 .xlf 文件?

    在 Angular 6 中 现在我想我理解了如何制作 i18n 文件并利用它们 例如https angular io guide i18n https angular io guide i18n 我想知道如何维护所述文件 如果我进入并更改
  • Docker - Spring Boot 应用程序 - 无法访问本地主机上的 MySql 服务器

    如何将在 Docker 中运行的 Spring Boot JAR 应用程序连接到我计算机上的 MySql 服务器 我尝试了不同的帖子 但这没有帮助 在我的 Spring Boot application properties 中 我有 sp
  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • 名称中带有点的 php 对象属性

    我有 mysql 表 其中包含 操作 日期 操作 名称 等列 将该表数据作为对象获取后 mysqli gt fetch object 我得到这个 行的 print r stdClass Object id gt 2 operation da
  • Composer - 添加 git 存储库而不使用composer.json

    我尝试从 github designmodo Flat UI 添加存储库 使用配置并收到错误No valid composer json was found in any branch or Your requirements could
  • Autodesk Forge BIM 360 API - 激活服务类型

    我们一直在使用 Forge API 在 BIM 360 中自动设置项目 但似乎无法找到自动激活服务 Field Glue 等 的方法 直觉上 我认为 service types 属性是执行此操作的方法 但服务没有激活 1 service t
  • 生产中未找到 symfony 2 路线

    我有这样的路线 login register 等 在开发环境中工作正常 起初 当我尝试通过 app php 而不是 app dev php 访问我的网站时 出现 404 错误 然后我跟着这个建议 https stackoverflow co
  • 可以将sharedPrefrence与Coroutine kotlin一起使用吗

    我已经注射了sharedPreference in ViewModel 我可以在嵌入 Coroutine 作用域时使用 Android 特定资源吗 当 ViewModel 失去作用域时 Coroutine 作用域会自动挂起 我的意思是 如果
  • 在日期 presto SQL 上运行总和

    我正在尝试使用 Presto SQL 根据下面的示例数据计算某个日期内 t 列和 s 列的累积总和 Date T S 1 2 19 2 5 2 1 19 5 1 3 1 19 1 1 我想得到 Date T S cum T cum S 1
  • ReDim 在 VB6 中保留为多维数组

    我正在使用 VB6 我需要做一个ReDim Preserve到多维数组 Dim n m As Integer n 1 m 0 Dim arrCity As String ReDim arrCity n m n n 1 m m 1 ReDim
  • 如何使用新的 html 文件打开更新电子浏览器窗口

    我是电子新手 我有两个 html 页面 我想在单击按钮时打开第二个页面 我的代码如下 但我只是得到一个空白窗口 不是第二页 这是index js const electron require electron const app Brows
  • 仅当存在 2 个类时,才能使用 CSS 定位元素吗?

    您可能已经知道 元素上可能有多个类 并用空格分隔 Example div class content main div 借助 CSS 您可以瞄准这一点div与任一 content or main 有没有办法瞄准它 如果并且仅当两个班都在吗
  • AspectJ - 匹配具有通用参数的方法的切入点

    我有一个接受任何类型作为其参数的通用方法 例如 我想要一个切入点 它与仅以 String 类型作为参数的方法的调用相匹配 最终的要求是将建议执行的范围限制为 字符串 参数 这是我的通用类和方法 public class Param