问题标签 [javassist]

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 回答
1098 浏览

java - 以字符串形式获取 Java 类型的签名

我需要获取(作为字符串)某些 Java 类型的类型签名

例如,这是某些ParameterizedType的类型签名:

在使用 Javassist 开发的应用程序的上下文中,我需要它。

为了更好地解释我在寻找什么,我展示了一个createGetter使用 Javassist 为私有字段生成 getter 方法的方法的摘录。该字段的类型是参数化类型(即,它使用泛型)。

createGetter方法的第一个参数是字段的类型,第二个参数是字段的名称,第三个参数是应该添加该方法的类:

例如,如果我有一堂课

然后在调用createGetterfield 的方法后myField,类变为:

生成的 getter 方法的返回类型应该与字段具有相同的通用签名(代码可以在没有具有相同字段通用签名的方法的情况下编译,因为只有相同的类对编译器来说很好。我需要它的原因具有相同类型的通用签名此处不解释)。

createGetter方法的代码说明,使用Javassist,为了设置一个方法的泛型类型签名,我需要首先获得一个String这样的类型签名(如果有其他方法请告诉我)。我知道 getter 方法应该具有的确切参数化类型,因为它与字段完全相同。但我有这样的类型作为ParameterizedType的实例。

我的问题是:在给定任意 Java Type的情况下,如何将这些类型签名作为字符串(包括类型参数数据)获得?

谢谢你的帮助。

0 投票
1 回答
669 浏览

java - 使用 javassist 创建非静态初始化程序

从我所见,我可以使用 javassist 在 java 类中创建一个新的静态初始化程序。但我需要的是一个非静态初始化程序。

因此,我不想添加: static{...} 到一个类,我只想添加 {..}

我想这样做的原因是因为我想创建一个类加载器,它返回由 ProxyFactory 包装的类,因为我必须向某些类添加一个处理程序。我的想法是将此代码添加到每个类的非静态初始化程序中: ((javassist.util.proxy.Proxy)this).setHandler(new library.proxy.Handler());

那么,任何想法如何添加非静态初始化程序?或者以不同的方式解决我的问题?非常感谢

0 投票
2 回答
456 浏览

java - Javassist:Bytecode.get() 不工作

bc.get()没有返回任何东西。我的目标是获取一个类的字节码。

0 投票
2 回答
11759 浏览

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

我有一个 java 类,它在启动时创建一个基于 javassist 类加载器的自定义类加载器,然后运行真正的程序类。我收到以下错误:

问题与一个对象是由原始类加载器创建的,而另一个是由自定义类加载器创建的这一事实有关。
有没有办法解决这个错误?

提前致谢,
阿夫纳

0 投票
1 回答
3421 浏览

java - 将 javassist 字节码操作与 maven 编译集成

我有一个使用 javac / aspectj 编译器编译的 maven 项目。
我想在编译了 javassist 程序的类上运行,该程序操纵编译的类并向它们添加东西。
我想使用“进程类”阶段来运行我的工具。
我的问题是用 javassist 对“目标/类”中创建的类文件进行迭代的最佳方法是什么,以便之后我可以加载、修复和保存。
另一个要求是也在测试类上运行该工具。
如果有一个开源项目可以做类似的事情,那么看到一个活生生的例子会很棒。
谢谢,
阿夫纳

0 投票
2 回答
716 浏览

playframework - 在 WebSphere 8 上播放 1.2.x

我想将一个简单的 Play (1.2.4) 应用程序部署到 WebSphere 8。我让该应用程序在 Windows 上本地运行。两者都是 Java 1.6。我使用以下方法创建了一个 WAR 文件:

然后修改生成的 web.xml 以定义我的服务器数据源,再次构建 war 文件并部署。在部署期间,它从 web.xml 中找到了我的资源引用,并将其绑定到 WAS 定义的数据源。然后我将类加载器顺序更改为“最后一个父级”(基于 Play 部署选项页面和其他线程)。然后我启动了应用程序,没有任何错误。

我有一个类,它使用标记为@OnApplicationStart 的方法扩展 play.jobs.Job。当我通过 WAS 控制台启动新安装的应用程序时,它会启动并执行此方法,该方法连接到数据源并加载一些数据并将其放入缓存中。

当我尝试访问我的第一个控制器时,问题就出现了,我得到了这个错误:

这是我的相关控制器代码:

该错误似乎来自会话引用。请注意,引用 renderArgs 的注释行在活动时也会导致类似的错误。

javassist 是否在某处没有正确“增强”?我尝试用最新版本替换 javassist jar,结果相同。

我正在努力让 Play 在这里的“企业”中发挥作用,所以我真的很喜欢这个工作。截至 2012 年 9 月,我无法判断 Play 是否在 WAS8 上成功运行。我会考虑 Play 2 (java),但它似乎绝对不支持 WAS,并且插件 play2war 看起来也不支持 WAS。愚蠢的是,我们不能没有 WAS,但这是我们企业的现实。

更新
我现在也尝试了 Play 1.2.5 并创建了一个新应用程序,并在 Application.index 方法中添加了一行 session.get("x") 。部署了war文件并在第一次访问时遇到了同样的错误。

0 投票
1 回答
310 浏览

powermock - Javassist 3.17.0-GA 何时可用

任何人都知道 Javassist 3.17.0-GA 何时可用?

Javaassit 中有一个错误(在 3.17.0-GA 中修复)在与 Java 7 一起使用时会破坏 PowerMock: https ://issues.jboss.org/browse/JASSIST-160?focusedCommentId=12718716&page=com.atlassian.jira .plugin.system.issuetabpanels:comment-tabpanel#comment-12718716

相关的 PowerMock 错误 http://code.google.com/p/powermock/issues/detail?id=355

0 投票
1 回答
2064 浏览

instance - 如何在 javassist 中从 ctClass 制作 newInstance?

我可以举个例子:

但我需要通过 javassist 修改类:

现在,我想从 ctClass 创建一个实例。我该怎么做?

0 投票
1 回答
2909 浏览

java - 使用 javassist 更改方法体的一部分

让我先解释一下我的目标......我需要更改方法主体的一部分,我的意思是,在方法内部我有几个调用,但只需要更改其中一个调用以使用两个参数而不是 1。因为我想在我想的方法中保持所有其余部分相同,获取方法主体,通过正则表达式更改这个特定的调用,我想更改并重新设置它。

假设这是这样做的好方法......我怎样才能得到方法体?

任何建议将不胜感激

谢谢

拉斐尔·莫伊塔

0 投票
1 回答
2182 浏览

java - 为使用 Javassist 创建的新方法的参数添加注释

我需要为方法参数添加注释。该方法之前是使用 javassist 创建的,例如:

我要添加的注释非常简单:

1) 在方法创建中写注解 throws

2)找到了这个解决方案,但它基于在我的情况下返回null的行:

我迷失了如何做到这一点;有没有人找到一种方法来创建一个新方法并为其参数添加任何注释?

提前致谢。