![](/img/trans.png)
[英]How to access the abstract class method without extending the Abstract class in java
[英]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 它还没有加载):
Runtime.getRuntime().exec
编译运行javac
的新代码(注意:您可能需要使用-classpath
添加依赖项)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.