Tag: javassist

Java字节码操作和JavareflectionAPI?

我最近遇到了“字节码操作”这个术语(为了研究这个问题,我偶然看到了字节码提供程序,同时在使用Hibernate的应用程序中看到了日志)。 我也知道(有点)Java Reflection API。 这两个概念是否相似? 它们之间有什么区别? 什么时候用哪个?

使用Javassist添加语句

System.out.println(“A read operation on a field is encountered “); 每当在非本地字段上执行读取操作时,如何添加语句(例如,上述语句)? 而且我还需要知道所读取字段的细节,并且细节集应该与字段的唯一性相对应 示例(删除问题中的抽象): public class Greet{ int knowncount; public Greet() { System.out.println(“Hello”); knowncount++; } public Greet(String language) { if(String.equals(“ENGLISH”)) {System.out.println(“Hello”); knowncount++; } else if(String.equals(“SPANISH”)) {System.out.println(“Hola”); knowncount++;} else System.out.println(“Language not recognized”); } public void showCount() { System.out.println(“count : “+knowncount); } } 用户类测试是: class test{ public static void […]

java.io.IOException:无效的常量类型:19 at 5

我有一个项目 。 它使用spring boot 2 , java 9和maven。 它可以使用mvn clean package成功构建。 要运行spring boot应用程序,我使用了该命令 java -jar java-cloud-rest-api/target/java-cloud-rest-api-0.0.1-SNAPSHOT.jar 但它失败了,错误 org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; n ested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1716) ~[spring-beans-5.0.0.RC3.jar!/:5.0.0.RC3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.0.0.RC3.jar!/:5.0.0.RC3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:499) ~[spring-beans-5.0.0.RC3.jar!/:5.0.0.RC3] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312) ~[spring-beans-5.0.0.RC3.jar!/:5.0.0.RC3] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) […]

在pre-main方法中使用javassist在运行时重命名字段(java instrumentation)

我想在运行时重命名java类中的字段。 此外,任何访问该字段的方法;读取或写入; 我需要将其修改为使用新名称而不是旧名称…. 所有这些都将在pre-main方法中完成…… 作为Exmaple,给出以下代码: public class Class1 { String strCompany; public String Test() { strCompany = “TestCompany”; return strCompany; } } 在上面的类中,我需要将字段“strCompany”更改为“strCompany2”,另外我需要使用方法Test来使用新名称而不是旧名称…. 可以使用ctField类中的setName方法更改字段名称,但是如何修改方法体以使用新名称。

修改Javassist中的行号

所以我最近一直在使用Javassist,我遇到了一个我无法找到答案的问题。 CtMethod的insertAt方法允许您在特定的行号处插入代码,但它是否会覆盖该行或保留它,如何使其与默认情况相反? 我有一个应用程序,它在运行时之前使用Javassist修改源代码,基于XML文件中的“钩子”。 我想这样做,以便可以覆盖一条线,或者可以在线上方放置一条线而不是覆盖它。 显然有一些黑客的方法可以做到这一点,但我宁愿使用正确的方法。

为什么在用Javassist更改方法体之后我必须调用.toClass()?

我通过Javassist修改我的TestClass的getMessage()方法体,如下所示: ClassPool cp = new ClassPool(true); CtClass ctClass = cp.get(“my.test.javassist.TestClass”); CtMethod ctMethod = ctClass.getDeclaredMethod(“getMessage”); ctMethod.setBody(“{ return \”Hello from javassist\”; }”); ctClass.toClass(); TestClass c = new TestClass(); System.out.println(c.getMessage()); 它运作良好。 但是,如果我删除ctClass.toClass()方法调用,则主体替换不起作用。 为什么? 我该如何正确替换getMessage()方法的主体? 我做得对吗?

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: […]

将字段添加到使用Javassist创建的Proxy类

我正在使用Javassist ProxyFactory创建一个Proxy类,其代码如下: ProxyFactory factory = new ProxyFactory(); factory.setSuperclass(entity.getClass()); factory.setInterfaces(new Class[] { MyCustomInterface.class }); ….. Class clazz = factory.createClass(); Object result = clazz.newInstance(); 问题是我还需要在类中添加一个字段。 但是,如果我做CtClass proxy = ClassPool.getDefault().get(clazz.getName()); 它会引发NotFoundException 如何添加使用createClass创建的类的字段? 有没有更好的方法来做我想做的事情?

Javassist:重新创建一个类 – 先删除,还是解冻()并修改?

我使用Javassist创建一个类。 在测试套件中,当第二个测试尝试创建相同的类时,它在pool.makeClass( … )处失败,因为该类被冻结(即已经通过toClass()创建。 克服这个问题的方法是什么? 理想情况下,第一个测试应该以某种方式删除类 – 也许从类加载器中卸载 – 但是当我在JLS中读取时 ,卸载操作是不可靠的。 因此,或许解决方法是检查创建代码的类是否存在,如果存在,则defrost()它,删除所有成员等,然后重新创建它。 还有其他想法吗? 或者是否有一些通过Javassist删除类的可靠方法?

如何在java中创建一个保留方法参数注释的动态代理?

我目前正在尝试代理一些现有的JAX / RS资源,以便允许我使用Hibernate Validator的方法validation支持。 但是,当我代理我的类(当前使用cglib 2.2)时,FormParam注释不存在于代理类中的参数上,因此JAX / RS运行时(apache wink)不会填充参数。 这里有一些测试代码显示: import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import javassist.util.proxy.ProxyFactory; public class ProxyTester { @Target( { PARAMETER }) @Retention(RUNTIME) public static @interface TestAnnotation { } public static interface IProxyMe { void […]