如何使用 Reflection 或 Javaassist 之类的方法从 Java 中的变量更改接口对象中的数字
How can I change a number in a interface object from a variable in Java using something like Reflection or Javassist
我有一个变量,它是一个新接口。我想改变其中的一些东西。
我不确定这是否可以通过 Reflection 或 Javassist 之类的东西实现。
这很难解释,但如果你看一下这个例子,你可能会更好地理解我。
如果您需要更多信息,请询问,因为我真的需要知道这个。
(这是来自 ProtocolLib 的代码,它使用 Netty。我想在运行时在 ProtocolLib 中修补一些东西;因此我想使用 Reflection 或 Javassist 之类的东西)
实际上;我刚刚注意到,使用一些意大利面条式代码,我可以使用反射让它工作。我将再次编辑此 post 让您知道这是否有效,然后与可能遇到与我相同问题的其他人分享我的解决方案。
这是一个例子:
final ChannelInboundHandler endInitProtocol = new ChannelInitializer<Channel>() {
@Override
protected void initChannel(final Channel channel) throws Exception {
try {
synchronized (networkManagers) {
if (MinecraftVersion.getCurrentVersion().getMinor() >= 12 /* I want to change this 12 to an 8 using Reflection or something like Javassist */) {
channel.eventLoop().submit(() ->
injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject());
} else {
injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject();
}
}
} catch (Exception ex) {
reporter.reportDetailed(ProtocolInjector.this, Report.newBuilder(REPORT_CANNOT_INJECT_INCOMING_CHANNEL).messageParam(channel).error(ex));
}
}
};
我完全忘了告诉你这个问题已经解决了。
我的解决方案:
我下载了 ProtocolLib 源代码,然后进行了更改以使其正常工作。然后我编译了 ProtocolLib,用 WinRAR 打开它,并提取了匿名 class (ProtocolInjector$1)。我将 class 添加到我的资源文件夹中。然后我使用 Javassist 在运行时从编译的 class 文件 (.class) 中创建一个新的 class 然后我用编译的修复替换了损坏的 ProtocolInjector$1 class一.
您可以在此处查看我如何解决该问题的承诺:GitHub
我有一个变量,它是一个新接口。我想改变其中的一些东西。 我不确定这是否可以通过 Reflection 或 Javassist 之类的东西实现。
这很难解释,但如果你看一下这个例子,你可能会更好地理解我。
如果您需要更多信息,请询问,因为我真的需要知道这个。
(这是来自 ProtocolLib 的代码,它使用 Netty。我想在运行时在 ProtocolLib 中修补一些东西;因此我想使用 Reflection 或 Javassist 之类的东西)
实际上;我刚刚注意到,使用一些意大利面条式代码,我可以使用反射让它工作。我将再次编辑此 post 让您知道这是否有效,然后与可能遇到与我相同问题的其他人分享我的解决方案。
这是一个例子:
final ChannelInboundHandler endInitProtocol = new ChannelInitializer<Channel>() {
@Override
protected void initChannel(final Channel channel) throws Exception {
try {
synchronized (networkManagers) {
if (MinecraftVersion.getCurrentVersion().getMinor() >= 12 /* I want to change this 12 to an 8 using Reflection or something like Javassist */) {
channel.eventLoop().submit(() ->
injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject());
} else {
injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject();
}
}
} catch (Exception ex) {
reporter.reportDetailed(ProtocolInjector.this, Report.newBuilder(REPORT_CANNOT_INJECT_INCOMING_CHANNEL).messageParam(channel).error(ex));
}
}
};
我完全忘了告诉你这个问题已经解决了。
我的解决方案: 我下载了 ProtocolLib 源代码,然后进行了更改以使其正常工作。然后我编译了 ProtocolLib,用 WinRAR 打开它,并提取了匿名 class (ProtocolInjector$1)。我将 class 添加到我的资源文件夹中。然后我使用 Javassist 在运行时从编译的 class 文件 (.class) 中创建一个新的 class 然后我用编译的修复替换了损坏的 ProtocolInjector$1 class一.
您可以在此处查看我如何解决该问题的承诺:GitHub