问题标签 [load-time-weaving]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
819 浏览

aspectj - 使用 AspectJ LTW 的 Spring AOP 不起作用

我正在使用spring aop并定义了一些方面。在我的 tomcat 上启用了 Spring LTW。在我的应用程序上下文中:

方面也工作得很好!但是目标类被代理了!导致 ClassCastException: can not convert $Proxy... 请注意,我的目标类没有被代理!

0 投票
1 回答
4314 浏览

spring - 在 Spring Framework 私有方法中使用 AspectJ 进行加载时编织

我已经构建了一个应用程序来测试围绕类注入日志信息(进入和退出)。我已经使用 spring 构建了它,并使用以下示例来构建它。

http://static.springsource.org/spring/docs/2.5.5/reference/aop.html#aop-aj-ltw

现在效果很好,但我有两个问题:

  • 当日志围绕方法编织时,不包括私有方法。spring 的 xml 设置中是否有允许编织私有方法的设置,或者是否有其他方法可以解决这个问题?
  • 我必须在 META-INF/aop.xml 中包含所有要编织的包才能使其工作。是否有一个设置可以使用,以便可以为项目中创建的所有类编织日志信息,而无需将包名添加到 aop.xml 中。

下面我包含了所有使用的代码和 xml。正如我所说,除了上述两个问题外,一切都很好。请帮助我。

应用程序.java

Client.java 包 se.jpab.application;

位置.java

aop.xml

方面

弹簧配置(spring.xml)

0 投票
3 回答
10830 浏览

java - 在运行时编织方面

我正在寻找一种 Java 解决方案,它允许我使用 AOP 在运行时已经运行的代码之上编织新代码。关键是不需要重启JVM。另外,我想在运行时删除编织,让旧代码以编织前的方式运行。

我在想 AspectJ 加载时间编织 + 运行时类加载/卸载会做到这一点。有人试过吗?有什么建议吗?谢谢你。

0 投票
1 回答
1576 浏览

tomcat - 如何在 Tomcat 中使用 AspectJ 加载时间编织?(无弹簧)

我想在从命令行启动 tomcat 服务器时传递 AspectJ 加载时间编织 JVM 参数,如下所示:

CLASSPATH变量指向aspectjweaver.jar文件。

我已经添加了论点

  • Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader,
  • Daj.class.path=path-to-jar-file-where-the-aspects-should-be-woven
  • Daj.aspect.path=path-of-jars-where-aspects-are-present(源 jar 也有一些编译的方面)。

但是,使用上述配置不适用于 Tomcat。我是否必须进行与 Tomcat 类路径或类加载器相关的任何其他更改?如果是,请帮忙。

我在没有 Tomcat 的情况下尝试了同样的事情,它工作正常。请帮助我。我想在不使用 Spring 的情况下完成这项工作。

0 投票
2 回答
8988 浏览

spring - 如何使用 Hibernate JPA 和 Spring Framework 启用加载时间/运行时编织

我在 Spring Framework 应用程序中使用 Hibernate 作为 JPA 提供程序(我使用它EntityManagerFactory而不是它)。SessionFactory我设法让 Spring Framework 的加载时间编织支持工作,所以我克服了这个障碍。

我需要在实体上启用延迟加载byte[]和属性。@ManyToOne我了解如何使用 Hibernate 的 ant 任务在构建时检测(编织)我的实体,但我想在运行时检测我的实体(加载时编织)。我在几个 Google 搜索结果中看到了对 in 的引用,但没有启用它的实际说明。我需要设置什么属性来指示 Hibernate 它可以在运行时检测我的实体?

0 投票
1 回答
2640 浏览

spring - 为什么我不能让弹簧负载时间编织工作

我一直在尝试让一个示例 @Configuration 构建工作(在 groovy 中),这样我就可以使用 spring 容器触发依赖注入,但我得到的只是关于 -javaagent 的错误,我似乎无法修复

我有一个像这样的 beanConfig 类

@Configuration @EnableSpringConfigured // should turn on AnnotationBeanConfigurerAspect @EnableLoadTimeWeaving (aspectjWeaving=AspectJWeaving.ENABLED) // switch on for this context class BeanConfig {

然后我将调用一个示例类 new 并尝试在 spring 容器之外进行注入,其中 diSource bean 在上面的配置类中声明

` @Configurable (autowire=Autowire.BY_TYPE, dependencyCheck=true) 类 ExtDI { @Autowired DISource diSource

`

在我的采样器类中,我调用它来尝试触发注入

` ... static void main (String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( /BeanConfig.class /) ctx.scan ("com.softwood") ctx.refresh () ....

`

在类路径上,我有 aspectjeaver-1.6.10.jar、aspectjrt-1.6.10.jar、spring-xxx-3.1.4.jars 等,这是我的 gradle depdency 列表

dependencies { compile 'org.codehaus.groovy:groovy-all:2.1.7' compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' compile "org.springframework:spring-core:${spring_version}" compile "org.springframework:spring-beans:${spring_version}" compile "org.springframework:spring-context:${spring_version}" compile "org.springframework:spring-aspects:${spring_version}" compile "org.springframework:spring-aop:${spring_version}" compile "org.springframework:spring-instrument:${spring_version}" compile "org.aspectj:aspectjrt:1.6.10" compile "org.aspectj:aspectjweaver:1.6.10" compile "cglib:cglib:2.2" }

在我拥有的 vm args 的 eclipse 项目运行时 -javaagent:C:/Users/802518659/aspectjweaver-1.6.10.jar

并尝试过使用 spring-instrument-3.1.4.jar 并遇到同样的问题。

当我运行项目时出现此错误

`

`

这告诉我我的应用程序无法检测 java 类加载器 - 尽管我使用 -javaagent:spring-instrument-xxx 或 aspectjweaver.jar 启动它 - 两者都失败了

那么我做错了什么-这真的开始困扰我-我可以在上下文中进行普通注入工作(没有LTW),但真的想在容器外进行这种注入工作

我究竟做错了什么

0 投票
1 回答
1307 浏览

java - 是否可以从 AspectJ 编织中排除接口类

设想:

我在一个包中混合了类、接口和枚举的源文件,如下所示:

目标:让所有类实现一个新接口和一个新方法。

问题:我可以成功地将接口编织到类中,并排除枚举,但我不知道如何防止新接口也被添加到包中的接口中。

我的方面目前看起来像:

在我的示例中,匹配Dog,Cat和。Animal

我之前尝试过:

因为Animal.class.getSuperclass() == null,相对于 Object,但无济于事。

我知道我可以通过将接口移出包来解决这个问题(如果事实证明这是不可能的,我很乐意这样做),但我很好奇是否有办法像我一样排除接口枚举。

很确定没关系,但我正在使用 javaagent 的加载时编织。

0 投票
0 回答
318 浏览

java - 加载时间编织在域对象中不起作用

我有一个场景,我需要在我的域对象(即使用new运算符创建的对象)中访问 spring 托管 bean。查了很多,发现可以使用aspectJ提供的Load Time Weaving来完成。据我所知,我已经完成了上述所有配置。我是aspectJ的新手。以下是我的代码和配置文件。

领域类,

控制器,

包 test.controllers;

应用程序上下文.xml

aop.xml,

我写了 -javaagent:c:\spring-agent-2.5.6.jar 作为 VM 参数

使用以下 jars 来支持 LTW 和 aspectJ,

  • aspectjrt-1.5.4.jar
  • spring-agent-2.5.6.jar
  • spring-aspect.jar
  • aspectjWeaver-1.5.4.jar
  • spring-2.5.6.jar

所有其他 spring 依赖项都工作正常,只有注入域对象(即使用new运算符创建的对象)中的依赖项不起作用,即这些依赖项我得到 null。

请帮忙。提前致谢。

0 投票
1 回答
211 浏览

java - 是否有任何关于加载时间字节码转换的解决方案而不在 java 命令行中指定 javaagent 选项

作为一个开源 Lifecycle Framework API 提供者,我想尽我所能,以隐式的方式隐藏内部设计来提供 Lifecycle API,这样会给 API Client 带来更多的便利。

预计会避免对核心 Java 应用程序和 Java EE 应用程序进行配置,但实际情况是我正在使用 java 命令 -javaagent:${path}/Lifecycle.jar 选项在类加载时启用我自己的 ClassFileTransformer。

经过一番搜索,发现了一些不清楚的方向。我需要一些 Java Guy 来总结和指导我们。

  1. agentmain vs premain
  2. 与指定的运行环境集成,例如 Glassfish 的 ByteCodePreprocessor,它有以下方法来进行字节码转换:

    public byte[] preprocess(String classname, byte[] classBytes);

我对这些方向的困惑:

  1. 对于Core Java Application,看来我们可以修改启动类的main方法来适配agentmain解决方案。还有其他选择吗?
  2. 对于使用 JavaEE Con​​tainer,例如 Glassfish,我可以使用 ByteCodePreprocessor 来修改类字节码,但是我需要创建一些新的类,但我不知道在哪里存储这些新的类文件,或者如何设计或应用一个新的ClassLoader 在预处理类文件期间加载新创建的类文件。

(BTW Lifecycle API 将遵循元驱动的风格,与没有 EntityManager 接口的 JPA 非常接近,目前大部分只是 Annotations 和 CallbackContext 接口和 LifecycleEvent 接口。)

0 投票
1 回答
1556 浏览

tomcat7 - AspectJ 没有看到 META-INF/aop.xml

我正在尝试让加载时间编织与我的 Tomcat 7 webapp 一起使用,以便从外部 jar 文件(位于WEB-INF/lib)中编织一个类。

我做了以下事情:

  1. 使用以下参数启动 Tomcat:-javaagent:/path/aspectjweaver-1.7.0.jar -classpath /path/aspectjrt-1.7.0.jar:etc

  2. 放入aop.xml_WAR_ROOT/META-INF/, WEB-INF/lib/META_INF, WEB-INF/lib and WEB-INF/

aop.xml:

无论我将文件放在哪里,我的目标类都没有编织,并且我不断看到这样的错误:

事实上,它试图在我指定的包之外编织一个类,并且考虑到服务器启动时间翻了两番,我认为它正在尝试编织所有类。

我错过了什么?