gpt4 book ai didi

Java - 在这种情况下如何正确规避非法访问异常

转载 作者:行者123 更新时间:2023-11-30 02:04:43 27 4
gpt4 key购买 nike

我遇到了这个奇怪的问题,即使(我认为)我将所有内容设置为可以正确访问,我仍然收到 IllegalAccessException。

java.lang.IllegalAccessException: class com.sasha.eventsys.SimpleEventManager can not access a member of class com.sasha.proxy.discord.DiscordMain with modifiers "private"

public void invokeEvent(SimpleEvent e){
registeredMethods.forEach(method -> {
if (method.getParameterTypes()[0] == e.getClass()){
try {
Class clasz = method.getDeclaringClass();
for (Field field : clasz.getFields()) {
field.setAccessible(true);
}
for (Method meth : clasz.getMethods()) {
meth.setAccessible(true);
}
for (Constructor<?> constructor : clasz.getConstructors()) {
constructor.setAccessible(true);
}
method.setAccessible(true);
method.invoke(clasz.newInstance(), e);
}
catch (Exception ex){
System.out.println("FATAL EXCEPTION DURING " + e.getClass().getName() + "'s EXECUTION");
ex.printStackTrace();
}
}
});
}

这是调用该方法的代码。理论上,那些 for 循环应该将所有内容设置为可访问,对吗?

@SimpleEventHandler
public void onMcMsgRecieved(MinecraftMessageRecievedEvent e){
if(Config.doDiscord) {
DiscordMain.theChannel = DiscordMain.findTheServer(jda.getTextChannelsByName(Config.channelName,false));
if (Config.aestheticDiscord) {
DiscordMain.renderViewport(e.getPlainText(), DiscordMain.theChannel, Caches.messagesRecieved==0);
Caches.messagesRecieved++;
}
else {
DiscordMain.theChannel.sendMessage("```html\n" + e.getPlainText().replace("discord.gg", "zozzle.gg").replace("`", "'").replaceAll("\247[^z]", "") + "\n```").submit();
}
Webhooks.pushToHook("```html\n" + e.getPlainText().replace("discord.gg", "zozzle.gg").replace("`", "'").replaceAll("\247[^z]", "") + "\n```");
}
}

这里据说是无法访问某些内容的地方。作为引用,此 block 中调用的所有字段和方法都是公共(public)或公共(public)静态的,因此,我不明白为什么它会出现问题。

最佳答案

Field的反射实例、方法、构造函数等只是一个副本并且 .setAccessible只影响该副本,因此代码如下

            for (Field field : clasz.getFields()) {
field.setAccessible(true);
}

什么也不做。

就你而言,我猜 .newInstance由于无参数构造函数是私有(private)的而抛出该错误?如果这是真的,那么您需要通过 .getDeclaredConstructor() 手动获取构造函数方法并将其设置为可访问并使用它来创建新实例。

关于Java - 在这种情况下如何正确规避非法访问异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com