Tag: cglib

从注释处理器应用CGLib代理

我有一个工作的注释处理器在编译时处理我的自定义注释,我想应用CGLIB代理将逻辑应用于使用MethodInterceptor一些方法,我有两个独立工作的东西。 我无法弄清楚如何应用注释处理器中的CGLIB代码。 我想要做的是能够使用我的自定义注释注释一个类,并让它自动添加我已经应用的Enhancer代码,所以我不必手动应用我自己的Enhancer代码。 这似乎是编译时注释处理的完美用例。

为什么cglib不代理超级调用?

我在下面有以下结构(我使用注释@Intercepted来表示截获的方法):当我在没有使用super关键字的情况下调用intercepted方法作为intercepted() ,会按预期调用拦截器。 但是,当以下面的方式调用时,永远不会调用super.intercepted()拦截。 为什么会这样? public class Base { @Intercepted public void intercepted() {} } public class BaseImpl extends Base { public void doSomething() { super.intercepted(); //<– does not work intercepted(); //<— without the super, it works } }

无法重新定义类当我尝试重新转换类时

我试图动态修改类,例如在行之前调用sleep()。 我在运行时使用Attach方法Attach代理程序Attach到jvm。 然后我从jvm获得了目标类,并对其进行了修改(添加一行来调用sleep() )。 我得到了redine类错误。 我使用的是JDK1.6。 我正在使用ASM核心API来修改类。 错误: Caused by: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields) at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:124) ASM代码有问题吗? 实际上我的ASM代码完成了它的工作(添加一行来调用sleep() )。 当前的jvm不支持转换类吗? 似乎无法执行retransformClasses() 。 retransformClasses()不支持ASM操作(在方法中添加一行来调用sleep() )? 有任何想法吗? 谢谢 编辑:我要修改的类: import java.util.concurrent.TimeUnit; public class Person { public String name = “abc”; public String address = “xxxxx” ; public […]

设置JVM选项以避免错误org.springframework.cglib.core.ReflectUtils $ 1 非法reflection访问

我使用Spring Boot 2.0.0.RC1,JDK 9.0.4,IntelliJ IDEA 2017.3.4 Ultimate,Gradle 4.5.1。 Spring Boot RC1版本(严格来说,Spring Framework 5.0.3.RELEASE)有一个已知的问题: https ://jira.spring.io/browse/SPR-15859,我也在这里看到它https://github.com/ dsyer /弹簧引导java的9#创建-A-弹簧引导应用 Spring开发人员建议 您可以通过在命令行中添加-illegal-access = deny来关闭它(Java 9中的默认值是允许的)。 我选择菜单帮助\编辑自定义VM选项… ,然后在文件的最后一行添加新选项。 然后我发现了错误 > Unrecognized option: -illegal-access=deny > > Error: Could not create the Java Virtual Machine. > > Error: A fatal exception has occurred. Program will exit. Full console log /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/bin/java -XX:TieredStopAtLevel=1 […]

cglib – MethodInterceptor&finalize?

我使用cglib MethodInterceptor来包装服务。 在每次调用服务时,它应该打开数据会话,将调用传递给服务,最后关闭会话。 但是,我注意到从Finalizer调用它时行为不端。 我得到以下stacktrace: java.lang.IllegalArgumentException: interface my.pkg.SomeInterface is not visible from class loader at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) at my.pkg.ProxyFactory.create(ProxyFactory.java:68) at my.pkg.SomeService.make(SomeService.java:181) at my.pkg.SomeService$SessionWrappingInterceptor.intercept(SomeService.java:1275) at my.pkg.SomeService$$EnhancerByCGLIB$$b58faf6a.finalize() at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 我究竟做错了什么? 我该如何解决?

增强java.util.Date类时,cglib会抛出IllegalArgumentException

我试图用cglib增强java.util.Date 。 它没有用,我对cglib没有经验,所以我想知道出了什么问题。 例如,以下代码增强了ArrayList工作原理: @Test public void enhance_ArrayList() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ArrayList.class); enhancer.setCallback(new FixedValue() { @Override public Object loadObject() throws Exception { return “Hello cglib!”; } }); ArrayList enhanced = (ArrayList)enhancer.create(); } 而以下代码: @Test public void enhance_Date() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Date.class); enhancer.setCallback(new FixedValue() { @Override public Object loadObject() throws […]

模拟CGLIB增强对象

mockito无法模拟CGLIB已经增强的对象吗? public class Article { @Autowired private dbRequestHandler @Autowired private filesystemRequestHandler @Transactional public ArticleDTO getArticleContents() { //extractText() and then save the data in DTO //extractImages() and then save the data in DTO // some other calls to other databases to save data in dto return articleDTO; } public void extractText() { //call to DB } […]

spring,如何更改cglib命名策略

当spring创建代理时,它使用带有默认命名策略的cglib。 有没有办法改变命名政策? 生成的类名与我使用的另一个框架冲突。

Java检测类是否是代理

是否可以检测类是否是代理 ( 动态 , cglib或其他 )? 让类A和B实现公共接口I 然后我需要定义一个例程的classEquals签名 public boolean classEquals(Class a, Class b); 这样,只有当a.equals(b)或Proxy(a).equals(b) ,它才会计算为true ,其中Proxy(a)表示类型A的动态代理(动态,cglib或其他)。 在@Jigar Joshi的帮助下,这是迄今为止的样子: public boolean classEquals(Class a, Class b) { if (Proxy.isProxyClass(a)) { return classEquals(a.getSuperclass(), b); } return a.equals(b); } 问题是它没有检测到例如CGLIB代理。

hibernate中的Javassist失败:无效的常量类型:60

我正在创建一个cli工具来管理现有的应用程序。 应用程序和测试都构建良好并运行良好,但尽管我在运行jar中存在的cli工具时收到javassist失败: INFO: Bytecode provider name : javassist … INFO: Hibernate EntityManager 3.5.1-Final Exception in thread “main” javax.persistence.PersistenceException: Unable to configure EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:371) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) … at com.sophware.flexipol.admin.AdminTool.(AdminTool.java:40) at com.sophware.flexipol.admin.AdminTool.main(AdminTool.java:69) Caused by: java.lang.RuntimeException: Error while reading file:flexipol-jar-with-dependencies.jar at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:131) at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:467) at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:457) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:347) … 11 more Caused by: […]