替换 Java 中的静态引用方法

2024-04-03

我有一个如下所示的类,其方法仅返回一个字符串,但我想修改它从另一个类返回的内容,而无需自己对其进行硬编码。

public class Name {
    public static String getName() {
        return "MyName";
    }
}

有什么办法可以做到这一点吗?我尝试了 BCEL 但这似乎并没有改变返回值。

编辑:这是一个模组。我试图通过不修改它来使其完全独立于现有代码。

Thanks.


Are you sure你试过BCEL吗?我创建了一个完整的示例here http://pastie.org/private/p05jdjpxskuj2ede0jsm2w.

JavaClass target;
try {
  target = Repository.lookupClass("Target");
} catch (final ClassNotFoundException ex) {
  throw new RuntimeException("unable to resolve Target", ex);
}
final ClassGen targetGen = new ClassGen(target);
final ConstantPoolGen pool = targetGen.getConstantPool();
final ConstantMethodref ref = (ConstantMethodref) pool.getConstant(
    pool.lookupMethodref("Name", "getName", "()Ljava/lang/String;"));
ref.setClassIndex(pool.lookupClass("Target"));
ref.setNameAndTypeIndex(pool.addNameAndType("$Name$getName", "()Ljava/lang/String;"));
final InstructionList code = new InstructionList();
final InstructionFactory factory = new InstructionFactory(targetGen, pool);
code.append(factory.createConstant("overriden-name"));
code.append(factory.createReturn(Type.STRING));
code.setPositions();
final MethodGen methodGen = new MethodGen(
    Constants.ACC_PRIVATE | Constants.ACC_SYNTHETIC | Constants.ACC_STATIC,
    Type.STRING, new Type[0], new String[0], "$Name$getName", "Target",
    code, pool);
methodGen.setMaxLocals(0);
methodGen.setMaxStack(1);
targetGen.addMethod(methodGen.getMethod());
try {
  targetGen.getJavaClass().dump("Target.class");
} catch (final IOException ex) {
  throw new RuntimeException("unable to save Target", ex);
}
C:\dev\scrap>javac Target.java
C:\dev\scrap>java Target
original-name
C:\dev\scrap>javac -cp .;bcel-6.0.jar Instrumenter.java
C:\dev\scrap>java -cp .;bcel-6.0.jar Instrumenter
C:\dev\scrap>java Target
overriden-name
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换 Java 中的静态引用方法 的相关文章

随机推荐

  • 使用 Spring/Hibernate 进行密码加密 - Jasypt 还是其他? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在数据访问层中使用 Spring 和 Hibernate JPA 的 Java 应用程序堆栈中 应用密
  • SQL charindex 抛出由于句点而传递给 LEFT 或 SUBSTRING 函数的长度参数无效?

    我的查询的 where 子句中有以下几行 但我不断收到此错误 Msg 537 Level 16 State 3 Line 3 Invalid length parameter passed to the LEFT or SUBSTRING
  • 是否可以同时将 Pub/Sub 和 BigQuery 作为 Google Dataflow 中的输入?

    在我的项目中 我希望在 Google Dataflow 中使用流式传输管道来处理 Pub Sub 消息 在清理输入数据时 我还希望获得来自 BigQuery 的侧面输入 这提出了一个问题 将导致两个输入之一无法工作 我在管道选项中设置了st
  • Django Forms:将参数传递给表单

    如何将参数传递到我的表单 someView form StylesForm data dict I also want to pass in site id here class StylesForm forms Form I want a
  • 如何在Windows桌面上绘制文字?

    我该如何将文本放置在 Windows 桌面上 有人告诉我 GetDesktopWindow 是我所需要的 但我需要一个例子 我假设您的最终目标是在桌面上显示某种状态信息 您必须执行以下任一操作 将 DLL 注入到 Explorer 的进程中
  • 给定表面法线,找到 3D 平面的旋转

    所以我有一个由 2 个向量描述的 3D 平面 P 位于平面上的点N 平面的表面法线 我有一个非常大的扁平方形多边形 我想渲染它来代表这个平面 我可以轻松地将多边形平移到给定点 但随后我需要找到适当的旋转来应用以使表面法线实际上成为表面法线
  • 无法使用 Google Drive api 复制 Google 幻灯片文件

    我想复制我的谷歌驱动器中存在的现有模板 ppt 然后我想将占位符文本更改为其他文本 这就是我正在尝试的 from google oauth2 import service account import googleapiclient dis
  • 如何从 django 数据库中下载 blob 字段中的数据?

    我有一个表 其中有一个包含一些数据的 blob 列 我如何在 django 中下载 blob 内容 我尝试了提到的解决方案here https stackoverflow com questions 4915397 django blob
  • 如何在 Python 中测试 Web API 限制

    我想使用 Python 测试给定站点的 Web API 限制 此 API 限制允许每个 IP 在 Y 秒内最多发出 X 个请求 我希望能够测试此限制的可靠性 特别是在边界情况下 X 1 请求 X 1 请求 你能建议一个好方法吗 我会编写一个
  • 如何在 Vue JS SPA 中进行开放图图像?

    我正在尝试在我的 VueJS 单页应用程序中包含开放图形图像 https developers facebook com tools debug https developers facebook com tools debug 给我这个链
  • 模糊测试(框架)Web应用程序?

    是否有可以对 Web 应用程序执行模糊测试的框架 我知道Selenium and WebDriver用于为 Web 应用程序构建测试 但我对内置模糊测试的库 框架或项目特别感兴趣 因此我不需要重新发明轮子 例如 我可以从以下功能中受益 随机
  • `.create()` 方法默认不支持可写嵌套字段。

    关于 DRF 中与中间模型的多对多关系的序列化 我有一个大问题 如果请求方法是 get 则一切正常 但是当我尝试将数据发布或放置到 API 时 我收到以下错误 Traceback most recent call last File Lib
  • ASP.NET MVC4 捆绑单个文件

    有没有办法使用 MVC4 中的新捆绑功能来捆绑单个文件 我知道捆绑单个文件没有多大意义 但我想使用服务器端缩小并让 MVC 在 URL 末尾附加哈希以用于缓存目的 我已经尝试过 Scripts Url Scripts myscript js
  • iOS7 中非消耗性产品的服务器端收据验证和 transactionReceipt 弃用

    我正在从以前的 iOS 移植一个工作应用程序 但在处理新的应用程序内购买收据时遇到了问题 我们现在的工作方式是从SKPaymentTransaction对象并将其发送到服务器进行验证 从我从其他问题中收集到的信息来看 收据现在似乎保存在一个
  • Android studio 1.4 和矢量图像

    今天我将android studio更新到1 4版本 我在变更日志中看到 您也可以为 api Error Execution failed for task app transformClassesWithDexForDebug gt co
  • Eclipse Java IDE JUnit5:junit.jupiter.api.Assertions 不可访问

    我对整个编程很陌生 但这是我的问题 我曾经通过右键单击项目在 Eclipse 中添加 JUnit 测试用例 然后添加新增 gt JUnit 测试用例 目前 我无法实现任何测试方法 因为 Eclipse 在线告诉我 import static
  • FPDF/FPDI 错误:致命错误:找不到类“setasign\Fpdi\FpdfTpl”

    我正在尝试为现有的 PDF 文档添加水印 这个错误在过去两天一直困扰着我 我的 FPDI 库位于 fpdi src 中 fpdf 库位于 fpdf 中 引发错误的文件是 Fpdi php 第 27 行 以下是前 30 行
  • Java 中的 tan() 返回一个奇怪的值

    我的代码将一个以弧度为单位的角度传递给cos tan and sin 一切似乎都工作正常 除了晒黑90 这给出了值16331239353195370由于某些奇怪的原因 示例代码 import java text DecimalFormat
  • 当最小 SDK 从 21 增加到 24 时,APK 大小增加了 35mb

    最近 我们将支持的最小 SDK 从 API 21 提高到了 24 显然 这一变化导致我们的 APK 大小从 65mb 增加到 103mb 从Android studio中的APK分析中 我们可以看到所有的 so文件的大小基本上都增加了一倍
  • 替换 Java 中的静态引用方法

    我有一个如下所示的类 其方法仅返回一个字符串 但我想修改它从另一个类返回的内容 而无需自己对其进行硬编码 public class Name public static String getName return MyName 有什么办法可