繁体   English   中英

Java更改方法返回而不访问类Class

[英]Java changing method return without access to the class Class

我正在修改其他人的代码以实现新功能,如果不更改其中一个函数的返回,我就无法做到这一点。 正如我所说,这不是我的代码,所以我不能更改任何一行代码。

函数本身如下:

package me.Mohamad82.MineableGems.Core;

public class DropReader {
  ...
  public DropReader() {}
  public CustomDrop readCustomDrop(ConfigurationSection section, String mined, @Nullable String sectionNumber) {
    ...
  }
}

我正在尝试做这样的事情:

package com.rogermiranda1000.mineit;

public class DropReader extends me.Mohamad82.MineableGems.Core.DropReader {
    public DropReader() {
        super();
    }

    @Override
    public CustomDrop readCustomDrop(ConfigurationSection section, String mined, @Nullable String sectionNumber) {
        CustomDrop drop = super.readCustomDrop(section, mined, sectionNumber);
        if (drop != null) {...}
        return drop;
    }
}

问题是我不知道从哪里开始。 我不能改变他们的代码来调用另一个对象,我也不能改变函数调用。

每次都会创建该对象(在使用 DropReader 的函数内部),因此反射不起作用,并且搜索我发现了一个名为 Javassist 的东西,但如果该类已经加载,它将不起作用。 我之前应该可以通过代码加载,但即使这样我也不知道我是否正确地解决了这个问题,你怎么看?

编辑:我会尝试更好地解释这种情况。 有一个名为Commands的类运行命令new DropReader().readCustomDrop(section, mined, sectionNumber) 问题是如果section.getString("mine") != null我需要更改readCustomDrop返回(我需要添加一个附加属性)。

我无法更改 Commands 的代码,也无法更改 DropReader。 命令必须获取修改后的对象。

Edit2:它应该适用于 Java 8 和 17。

可能最好的方法是 Java Instrumentation,但它对我来说太复杂了,所以我做了以下操作(假设你有 .jar,而 .jar 它还没有加载):

  1. 使用 ZipFile 类将 .jar 作为 Zip 打开
  2. 将 .java 发送到 ClassFileToJavaSourceDecompiler(来自JD-Core )并反编译它
  3. 更改 .java 代码
  4. 使用Runtime.getRuntime().exec编译运行javac的新代码(注意:您可能需要使用-classpath添加依赖项)
  5. 将编译好的 .java 添加到 .jar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM