问题标签 [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.
aspectj - 使用 AspectJ LTW 的 Spring AOP 不起作用
我正在使用spring aop并定义了一些方面。在我的 tomcat 上启用了 Spring LTW。在我的应用程序上下文中:
方面也工作得很好!但是目标类被代理了!导致 ClassCastException: can not convert $Proxy... 请注意,我的目标类没有被代理!
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)
java - 在运行时编织方面
我正在寻找一种 Java 解决方案,它允许我使用 AOP 在运行时已经运行的代码之上编织新代码。关键是不需要重启JVM。另外,我想在运行时删除编织,让旧代码以编织前的方式运行。
我在想 AspectJ 加载时间编织 + 运行时类加载/卸载会做到这一点。有人试过吗?有什么建议吗?谢谢你。
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 的情况下完成这项工作。
spring - 如何使用 Hibernate JPA 和 Spring Framework 启用加载时间/运行时编织
我在 Spring Framework 应用程序中使用 Hibernate 作为 JPA 提供程序(我使用它EntityManagerFactory
而不是它)。SessionFactory
我设法让 Spring Framework 的加载时间编织支持工作,所以我克服了这个障碍。
我需要在实体上启用延迟加载byte[]
和属性。@ManyToOne
我了解如何使用 Hibernate 的 ant 任务在构建时检测(编织)我的实体,但我想在运行时检测我的实体(加载时编织)。我在几个 Google 搜索结果中看到了对 in 的引用,但没有启用它的实际说明。我需要设置什么属性来指示 Hibernate 它可以在运行时检测我的实体?
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),但真的想在容器外进行这种注入工作
我究竟做错了什么
java - 是否可以从 AspectJ 编织中排除接口类
设想:
我在一个包中混合了类、接口和枚举的源文件,如下所示:
目标:让所有类实现一个新接口和一个新方法。
问题:我可以成功地将接口编织到类中,并排除枚举,但我不知道如何防止新接口也被添加到包中的接口中。
我的方面目前看起来像:
在我的示例中,匹配Dog
,Cat
和。Animal
我之前尝试过:
因为Animal.class.getSuperclass() == null
,相对于 Object,但无济于事。
我知道我可以通过将接口移出包来解决这个问题(如果事实证明这是不可能的,我很乐意这样做),但我很好奇是否有办法像我一样排除接口枚举。
很确定没关系,但我正在使用 javaagent 的加载时编织。
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。
请帮忙。提前致谢。
java - 是否有任何关于加载时间字节码转换的解决方案而不在 java 命令行中指定 javaagent 选项
作为一个开源 Lifecycle Framework API 提供者,我想尽我所能,以隐式的方式隐藏内部设计来提供 Lifecycle API,这样会给 API Client 带来更多的便利。
预计会避免对核心 Java 应用程序和 Java EE 应用程序进行配置,但实际情况是我正在使用 java 命令 -javaagent:${path}/Lifecycle.jar 选项在类加载时启用我自己的 ClassFileTransformer。
经过一番搜索,发现了一些不清楚的方向。我需要一些 Java Guy 来总结和指导我们。
- agentmain vs premain
与指定的运行环境集成,例如 Glassfish 的 ByteCodePreprocessor,它有以下方法来进行字节码转换:
public byte[] preprocess(String classname, byte[] classBytes);
我对这些方向的困惑:
- 对于Core Java Application,看来我们可以修改启动类的main方法来适配agentmain解决方案。还有其他选择吗?
- 对于使用 JavaEE Container,例如 Glassfish,我可以使用 ByteCodePreprocessor 来修改类字节码,但是我需要创建一些新的类,但我不知道在哪里存储这些新的类文件,或者如何设计或应用一个新的ClassLoader 在预处理类文件期间加载新创建的类文件。
(BTW Lifecycle API 将遵循元驱动的风格,与没有 EntityManager 接口的 JPA 非常接近,目前大部分只是 Annotations 和 CallbackContext 接口和 LifecycleEvent 接口。)
tomcat7 - AspectJ 没有看到 META-INF/aop.xml
我正在尝试让加载时间编织与我的 Tomcat 7 webapp 一起使用,以便从外部 jar 文件(位于WEB-INF/lib
)中编织一个类。
我做了以下事情:
使用以下参数启动 Tomcat:
-javaagent:/path/aspectjweaver-1.7.0.jar -classpath /path/aspectjrt-1.7.0.jar:etc
放入
aop.xml
_WAR_ROOT/META-INF/, WEB-INF/lib/META_INF, WEB-INF/lib and WEB-INF/
aop.xml:
无论我将文件放在哪里,我的目标类都没有编织,并且我不断看到这样的错误:
事实上,它试图在我指定的包之外编织一个类,并且考虑到服务器启动时间翻了两番,我认为它正在尝试编织所有类。
我错过了什么?