我遇到了一个奇怪的问题,即使(我认为)我将所有内容都设置为可以正确访问,但仍然收到IllegalAccessException。
java.lang.IllegalAccessException:类 com.sasha.eventsys.SimpleEventManager无法访问类的成员 com.sasha.proxy.discord.DiscordMain带有修饰符“私有”
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```");
}
}
据说这里是无法访问某些内容的地方。作为参考,此块中调用的所有字段和方法都是公共的或公共静态的,所以,我不知道为什么它有问题。
答案 0 :(得分:2)
Field
,方法,构造函数等反射实例仅是一个副本,.setAccessible
仅影响该副本,因此类似
for (Field field : clasz.getFields()) {
field.setAccessible(true);
}
什么都不做。
在您的情况下,我会猜测.newInstance
会抛出该错误,因为no-args构造函数是私有的?如果是这样,则您需要通过.getDeclaredConstructor()
方法手动获取构造函数,并将其设置为可访问并使用它来创建新实例。