AspectJ 的 NoSuchMethodError

2024-03-20

注意:这是概念实现的证明,而不是最终的事情。

我有第三个。派对附加组件,我想限制他们对声音的使用,例如限制持续时间等(安全管理器不可能实现)。为了实现这一点,我考虑用包装器替换 AudioSystem.getLine() 的返回值。 这是测试方面:

@Aspect
public class MixerAspect {
    @Around("execution(* javax.sound.sampled.AudioSystem.getLine(javax.sound.sampled.Line.Info))")
    public Object getLineAdvice(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("AspectJ");
        pjp.getArgs();
        Line ret = (Line) pjp.proceed();
        return ret;
    }
}

每个附加组件都有自己的类加载器,并且它们通常不共享对象,所以这就是我想出的:

@Override
public Class<?> loadClass(String className) throws ClassNotFoundException {
....
if (className.equals(AudioSystem.class.getName())) {
    .....
    byte[] array = buffer.toByteArray();
        try {
            if (mixed == null)
                mixed = weaver.defineClass(className, array, new CodeSource(mixerAspect, (CodeSigner[]) null));
            return mixed;
        } catch (IOException e) {
            throw new ClassNotFoundException("unable to define class", e);
        }

这是 WeavingURLClassloader 的初始化代码:

weaver = new WeavingURLClassLoaderHelper(new URL[0], parent);
weaver.addURL(aspects[0]);

Parent 是可以访问 Mixer Aspect 的类加载器,Aspect 是一个 url 数组,其中唯一的元素是指向 MixerAspect 所在目录的一个。 我的aop.xml:

<aspectj>
    <aspects>
        <aspect name="org.intellimate.izou.security.replaced.MixerAspect"/>
    </aspects>

    <weaver options="-Xset:weaveJavaxPackages=true -verbose -showWeaveInfo -debug">
        <!-- Weave types that are within the javax.* or org.aspectj.*
             packages. Also weave all types in the foo package that do
             not have the @NoWeave annotation. -->
        <include within="javax.*"/>
        <include within="org.intellimate.izou.security.replaced.*"/>
        <include within="javax.sound.sampled.AudioSystem"/>
    </weaver>
</aspectj>

这是(相关)日志:

....(no relevant log)
TraceFactory.instance=org.aspectj.weaver.tools.Jdk14TraceFactory@53aad5d5
[WeavingURLClassLoaderHelper] info AspectJ Weaver Version 1.8.5 built on Thursday Jan 29, 2015 at 01:03:58 GMT
[WeavingURLClassLoaderHelper] info register classloader ro.fortsoft.pf4j.IzouPluginClassLoader$WeavingURLClassLoaderHelper
[WeavingURLClassLoaderHelper] info using configuration /Users/LeanderK/IdeaProjects/Izou/target/classes/META-INF/aop.xml
[WeavingURLClassLoaderHelper] info register aspect org.intellimate.izou.security.replaced.MixerAspect
[WeavingURLClassLoaderHelper] info AspectJ Weaver Version 1.8.5 built on Thursday Jan 29, 2015 at 01:03:58 GMT
[WeavingURLClassLoaderHelper] info register classloader ro.fortsoft.pf4j.IzouPluginClassLoader$WeavingURLClassLoaderHelper
[WeavingURLClassLoaderHelper] info using configuration /Users/LeanderK/IdeaProjects/Izou/target/classes/META-INF/aop.xml
[WeavingURLClassLoaderHelper] info register aspect org.intellimate.izou.security.replaced.MixerAspect
...(no relevant log)
[WeavingURLClassLoaderHelper] debug weaving 'javax.sound.sampled.AudioSystem'
[WeavingURLClassLoaderHelper] weaveinfo Join point 'method-execution(javax.sound.sampled.Line javax.sound.sampled.AudioSystem.getLine(javax.sound.sampled.Line$Info))' in Type 'javax.sound.sampled.AudioSystem' (AudioSystem.java:410) advised by around advice from 'org.intellimate.izou.security.replaced.MixerAspect' (MixerAspect.class(from MixerAspect.java))
[WeavingURLClassLoaderHelper] debug generating class 'javax.sound.sampled.AudioSystem$AjcClosure1'
2015-05-24 20:12:13,945 FATAL [Thread-5] org.intellimate.izou.threadpool.ThreadPoolManager (ThreadPoolManager.java:59) - unable to provide callback for: org.intellimate.izou.addon.AddOnManager$$Lambda$19/970865974@1f4f3b69
java.util.concurrent.CompletionException: java.lang.NoSuchMethodError: org.intellimate.izou.security.replaced.MixerAspect.aspectOf()Lorg/intellimate/izou/security/replaced/MixerAspect;
    at java.util.concurrent.CompletableFuture.internalComplete(CompletableFuture.java:205) [?:1.8.0_25]
    at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:459) [?:1.8.0_25]
    at java.util.concurrent.CompletableFuture$Async.run(CompletableFuture.java:428) [?:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_25]
    at org.intellimate.izou.threadpool.ThreadPoolManager$LoggingThreadFactory$1.run(ThreadPoolManager.java:73) [classes/:?]
Caused by: java.lang.NoSuchMethodError: org.intellimate.izou.security.replaced.MixerAspect.aspectOf()Lorg/intellimate/izou/security/replaced/MixerAspect;
    at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:410) ~[?:1.8.0_25]
    at leanderk.izou.playground.ExampleAddOn.prepare(ExampleAddOn.java:41) ~[?:?]
    at org.intellimate.izou.sdk.addon.AddOn.register(AddOn.java:41) ~[?:?]
    at org.intellimate.izou.addon.AddOnManager$$Lambda$19/970865974.run(Unknown Source) ~[?:?]
    at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:454) ~[?:1.8.0_25]
    ... 4 more

看起来好像不会编织,但为什么呢?我不知道还能尝试什么。我有以下依赖项:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.5</version>
 </dependency>
 <dependency>
    <groupId>aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.5.4</version>
 </dependency>

更复杂的是,类加载器位于另一个项目中,并且对该项目有一个简单的 Maven 依赖关系。 我是否缺少一些方面初始化?


编辑以澄清答案: 您还必须通过 WeavingURLClassloader 定义方面,这是我的(示例 - 其简化的)代码,同样可以应用于您想要混合的每个类。就我而言,该类已经通过系统类加载器加载,因此我必须显式调用define(注意,从不同类加载器加载的相同类并不相同!)

private Class mixer = null;
......
@Override
public Class<?> loadClass(String className) throws ClassNotFoundException {
   .....
   else if (className.contains("MixerAspect")) {
        InputStream is = this.getResourceAsStream(className.replace('.', '/') + ".class");
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        int nRead;
        byte[] data = new byte[16384];

        try {
            while ((nRead = is.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }
        } catch (IOException e) {
            throw new ClassNotFoundException("unable to load class", e);
        }

        try {
            buffer.flush();
        } catch (IOException e) {
            throw new ClassNotFoundException("unable to load class", e);
        }
        byte[] array = buffer.toByteArray();
        URL mixerAspect = getResource("org/intellimate/izou/security/replaced/MixerAspect.class");
        try {
            if (mixer == null) {
                mixer = weaver.defineClass(className, array, new CodeSource(mixerAspect, (Certificate[]) null));
            }
            return mixer;
        } catch (IOException e) {
            throw new ClassNotFoundException("unable to define class", e);
        }
    }

是的,我选择了第二个,它在 LTW 中有效。

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!--<weaver options="-verbose -showWeaveInfo -debug">-->
        <include within="com.rabbitmq.client.impl.ChannelN"/>
        <include within="**.MQAspect"/>
    </weaver>
    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="**.MQAspect"/>
    </aspects>
</aspectj>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AspectJ 的 NoSuchMethodError 的相关文章

随机推荐

  • Scala/Java 枚举

    我读了this https stackoverflow com questions 1321745 scala doesnt have enums what to use instead of an enum and this https
  • 将 Matplotlib 图转换为 NumPy 数组,没有任何边框/框架或轴

    我正在尝试将 Python 生成的图像与文件中的图像 照片进行比较 到目前为止 最好的方法是在 Matplotlib 中生成一个图形 然后将其转换为 numpy 数组 并将这些值与我从图像中获得的值进行比较 我得到了以下代码 将 Matpl
  • 对不完整类型的引用

    根据 C 03 标准 引用不完整类型是否有效 我不知道有任何实现将引用实现为非空指针以外的任何其他实现 因此这样的代码应该可以工作 但是 我想知道对不完整类型的引用是否符合标准 我希望得到带有引用和 C 标准参考的答案 据我所知 C 标准没
  • jQuery 下一个有特殊类型子元素的兄弟

    我的 HTML 有一个包含许多同级元素的容器元素div元素 每个元素包含一个contenteditable p 这些兄弟姐妹div然而 被其他人 打断 div其中不包含可编辑元素 目前对我来说挑战的是如何 跳过 这些干扰div使用左右箭头键
  • 如何使用单个删除从对象中删除多个属性?

    我有以下对象 var myArr one 1 two 2 three 3 four 4 five 5 我想立即从该对象中删除三个属性 例如 delete myArr one three five 但它正在失败 我是否必须对每个属性执行独立删
  • 获取创建的表名

    我正在尝试创建一个event trigger 每当表已创建 当发生这种情况时 我想插入到一个表中 该表有 2 列id and tablename 创建的表的名称 阅读文档我无法找到如何获取表名 到目前为止我有这个 CREATE OR REP
  • 使用facet_grid将“标题”添加到我的因素中

    我想使用 ggplot2 为我的因素添加文本 标题 例如 对于来自 reshape2 库的数据 library reshape2 library ggplot2 ggplot tips aes x total bill y tip tota
  • 如何将Java时间戳转换为ms access Date?

    我想将 java 时间戳插入到 msaccess 数据库中 但收到下面列出的错误 ms access 字段已设置为 DATE 数据类型 任何建议将不胜感激 谢谢 这是我的 DAO 类方法 public void addSale String
  • 将用户定义的表传递给存储过程

    我有一个用户定义表 我正在将其从存储过程中传递到存储过程中 DECLARE tmpInput MyTableType Table is populated from an INPUT XML exec ValidateInputXML SE
  • 向下滚动时标题会发生变化(jQuery)

    TechCrunch 最近重新设计了他们的网站 他们有一个可爱的标题 当你向下滚动时 它会缩小为更薄的品牌版本 你可以在这里明白我的意思 http techcrunch com http techcrunch com 我将如何创建这样的东西
  • 如何将原始二进制数据转换为 blob 并将其显示在 img 标记中?

    我正在 Electron 和 Svelte 中制作梦想日记应用程序 我有一种自定义文件格式 其中包含标题 描述和一张或多张图像 看 程序输入 文件输出 当我需要的时候 我可以打电话ipcRenderer invoke 在主进程中读取文件 然
  • 通过 REST API Java 从 URL 获取 ObjectID

    我尝试将讨论添加到用户故事中 部分代码 QueryResponse storyQueryResponse restApi query storyRequest JsonObject storyJsonObject storyQueryRes
  • 如何在 matplotlib 等高线图中设置虚线长度

    我正在 matplotlib 中制作一些等高线图 但破折号的长度太长 虚线也不好看 我想手动设置破折号的长度 当我使用 plt plot 制作简单的绘图时 我可以设置精确的破折号长度 但是我无法弄清楚如何使用等高线图做同样的事情 我认为以下
  • 如何处理 Google Play 中的待处理购买

    我们的大多数购买在 3 天 30 分钟后不断被取消 我认为这是待购买状态的结果 然而 关于如何准确处理待处理购买的文档却很少 而且 由于某种原因 即使我自己是测试人员 我也无法测试它 因为购买方式上没有 慢卡 选项 此外 我们没有后端服务器
  • C# 将行添加到具有自动增量列的数据表

    我有一个数据表 其中包含 A B C 列 我已将 A 列的 is Identity 属性设置为 true 但现在无法向表中添加任何行 我正在尝试的代码是这样的 dsA dtA row dsA dtA NewdtARow row B 1 ro
  • JavaScript 超时 - 规范 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这不仅仅是一个问题 它是一个确保Ja
  • 为什么 git revert 会抱怨缺少 -m 选项?

    所以我正在和其他人一起开发一个项目 并且有多个 github 分支正在开发中 有人刚刚修复了一个问题 我与他的分支合并 但后来我意识到我可以找到更好的解决方案 我想恢复我刚刚所做的提交 我尝试这样做git revert HEAD但它给了我这
  • 如何使用 refs/remotes 中的所有分支和标签克隆 git 存储库?

    我有一个从 svn 存储库创建的本地 git 存储库 git svn clone s svn 然后我创建了一个备份遥控器并将所有内容推送到其中 git remote add backup git myhost mybackup git gi
  • 子进程输出到 stdout 和 PIPE

    我正在使用subprocess像这样的模块 ping subprocess Popen fping exe 192 168 2 3 196 65 58 69 stdout PIPE output ping stdout readlines
  • AspectJ 的 NoSuchMethodError

    注意 这是概念实现的证明 而不是最终的事情 我有第三个 派对附加组件 我想限制他们对声音的使用 例如限制持续时间等 安全管理器不可能实现 为了实现这一点 我考虑用包装器替换 AudioSystem getLine 的返回值 这是测试方面 A