Tag: javassist

“()V”在class级签名中的含义是什么?

我用Javassist创建了一个没有实际方法的构造函数 CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass ); 当我试图推出这个类的签名时 c.getSignature(); 我明白了 public Echo ()V 我很困惑“V”是什么意思? 我期待公共Echo(); 或类似的东西……

Javassist进行。 什么是主要想法和实际使用的地方?

我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法。 好的,但为什么我们需要操纵字节码? 任何真实的例子? 任何真正的应用程序,javassist使用?

如何使用检测打印出Java中运行时调用的所有方法?

我想打印出在运行时调用的所有方法。 它们应该按照它们被调用的顺序打印出来,如果它们被多次调用,它们应该多次打印。 这可以用于逆向工程 – 查看按下按钮或执行特定操作时调用哪些函数。 我想为此使用Java代理和检测。

PowerMock和Java 8问题:InterfaceMethodrefInfo无法强制转换为MethodrefInfo

我在尝试使用PowerMock和Mockito执行unit testing时遇到了问题。 我需要PowerMockito来模拟静态方法。 这些是我使用的版本: PowerMock 1.6.2 Mockito 1.10.19 JUnit 4.12 Java 8 当我添加注释@PrepareForTest(Graph.class)时,我收到以下错误: java.lang.IllegalStateException: Failed to transform class with name name.of.my.package.GraphUtil. Reason: javassist.bytecode.InterfaceMethodrefInfo cannot be cast to javassist.bytecode.MethodrefInfo 我在官方的PowerMock Google页面上看到这与javassist有关。 但我有点失落,我不知道如何解决它。 为了以防万一,我也尝试下载最新的Powermock SNAPSHOT(1.6.3-SNAPSHOT),但也没有用。 请问有人帮帮我吗? 提前致谢

将动态参数传递给注释

我想知道是否有可能将动态值传递给注释属性。 我知道注释不是为了修改而设计的,但是我使用的是Hibernatefilter,并且在我的情况下,条件不是静态的。 我认为唯一的解决方案是使用librairies,其目的是读取和修改字节代码,如Javassist或ASM,但如果有另一个解决方案,它会好得多。 ps:在我的情况下的困难是我应该修改注释(属性的值),但我上面提到的librairies允许创建不编辑这就是为什么我想知道另一个解决方案 提前致谢

在运行时替换某些方法的内容

我想在运行时替换一些方法的内容。 我知道我可以使用javassist ,但它不起作用,因为我想要增强的类已经被系统classLoader加载。 我该怎么做,在运行时替换方法的内容? 我应该尝试卸载课程吗? 我怎样才能做到这一点 ? 我看到它是可能的,但我无法弄清楚如何做到这一点。 如果可能的话,我想避免使用外部库,我想自己编写代码。 更多信息: – 我想要增强的类包含在一个框架中(在一个jar文件中) – 我的代码实际上是这个框架的一个插件 – 我的插件运行的框架有自己的classLoader ,但是这个classLoader没有加载自己的类(它将它们委托给系统类加载器) – 我正在使用的框架是Play 。 谢谢您的帮助 !

使用自定义类加载器配置org.apache.log4j.ConsoleAppender

我有一个java类,它在启动时基于javassist类加载器创建一个自定义类加载器,然后运行真正的程序类。 我收到以下错误: log4j:ERROR A “org.apache.log4j.ConsoleAppender” object is not assignable to a “org.apache.log4j.Appender” variable. log4j:ERROR The class “org.apache.log4j.Appender” was loaded by log4j:ERROR [javassist.Loader@6f97b10a] whereas object of type log4j:ERROR “org.apache.log4j.ConsoleAppender” was loaded by [java.net.URLClassLoader@5b414a8d]. log4j:ERROR Could not instantiate appender named “stdout”. 问题与以下事实有关:一个对象由原始类加载器创建,而另一个对象由自定义类加载器创建。 有没有办法解决这个错误? 提前致谢, 阿夫纳

使用Javassist向运行时生成的方法/类添加注释

我正在使用Javassist生成类foo ,使用方法bar ,但我似乎无法找到一种方法来向方法添加注释(注释本身不是运行时生成的)。 我试过的代码看起来像这样: ClassPool pool = ClassPool.getDefault(); // create the class CtClass cc = pool.makeClass(“foo”); // create the method CtMethod mthd = CtNewMethod.make(“public Integer getInteger() { return null; }”, cc); cc.addMethod(mthd); ClassFile ccFile = cc.getClassFile(); ConstPool constpool = ccFile.getConstPool(); // create the annotation AnnotationsAttribute attr = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag); Annotation annot = new Annotation(“MyAnnotation”, […]

思考 – Java 8 – 无效的常量类型

我有一个Reflections库的问题。 我试图动态加载实现特定接口的所有类。 只要我不在这些类中使用lambda表达式(java 8),一切正常(所有类都被加载)。 我试过升级lib版本,但效果是一样的(java.io.IOException:无效的常量类型:18)。 依赖并在pom.xml中构建 org.reflections reflections 0.9.10 javassist javassist org.javassist javassist 3.19.0-GA org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 没有排除是相同的效果。 码: URL jarUrl = jarFile.toURI().toURL(); URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); ConfigurationBuilder builder = new ConfigurationBuilder() .addClassLoader(child) .addUrls(jarUrl) .setScanners(new SubTypesScanner()); Reflections r = new Reflections(builder); return r.getSubTypesOf(cls); 如何使用lambda表达式加载类? PS抱歉英语:)