java - NoSuchMethodException when instantiating a class using newInstance() -


i'm using following code instantiate every class in package:

        (class listenerclass : classgetter.getclassesforpackage(this, "cullan.listener")) {         bukkit.getlogger().info(listenerclass.getsimplename());         if (!listenerclass.getsimplename().equals("enchantmentlistener")) {             try {                 listenerclass.newinstance();             } catch (exception ex) {                 ex.printstacktrace();             }         }     } 

this works fine, however, i'm getting error when 1 of classes being instantiated:

[07:07:58] [server thread/warn]: java.lang.instantiationexception: cullan.listener.agilitylistener$1     [07:07:58] [server thread/warn]:    @ java.lang.class.newinstance(unknown source)     [07:07:58] [server thread/warn]:    @ cullan.main.dcenchants.loadenchants(dcenchants.java:62)     [07:07:58] [server thread/warn]:    @ cullan.main.dcenchants.onenable(dcenchants.java:24)     [07:07:58] [server thread/warn]:    @ org.bukkit.plugin.java.javaplugin.setenabled(javaplugin.java:321)     [07:07:58] [server thread/warn]:    @ org.bukkit.plugin.java.javapluginloader.enableplugin(javapluginloader.java:340)     [07:07:58] [server thread/warn]:    @ org.bukkit.plugin.simplepluginmanager.enableplugin(simplepluginmanager.java:405)     [07:07:58] [server thread/warn]:    @ net.skycraftmc.pluginmanager.pluginmanagerplugin.oncommand(pluginmanagerplugin.java:287)     [07:07:58] [server thread/warn]:    @ org.bukkit.command.plugincommand.execute(plugincommand.java:44)     [07:07:58] [server thread/warn]:    @ org.bukkit.command.simplecommandmap.dispatch(simplecommandmap.java:141)     [07:07:58] [server thread/warn]:    @ org.bukkit.craftbukkit.v1_8_r3.craftserver.dispatchcommand(craftserver.java:646)     [07:07:58] [server thread/warn]:    @ org.bukkit.craftbukkit.v1_8_r3.craftserver.dispatchservercommand(craftserver.java:632)     [07:07:58] [server thread/warn]:    @ net.minecraft.server.v1_8_r3.dedicatedserver.ao(dedicatedserver.java:409)     [07:07:58] [server thread/warn]:    @ net.minecraft.server.v1_8_r3.dedicatedserver.b(dedicatedserver.java:373)     [07:07:58] [server thread/warn]:    @ net.minecraft.server.v1_8_r3.minecraftserver.a(minecraftserver.java:709)     [07:07:58] [server thread/warn]:    @ net.minecraft.server.v1_8_r3.minecraftserver.run(minecraftserver.java:612)     [07:07:58] [server thread/warn]:    @ java.lang.thread.run(unknown source)     [07:07:58] [server thread/warn]: caused by: java.lang.nosuchmethodexception: cullan.listener.agilitylistener$1.<init>()     [07:07:58] [server thread/warn]:    @ java.lang.class.getconstructor0(unknown source) 

this class throwing error:

    package cullan.listener; import cullan.type.enchantmentrarity; import org.bukkit.enchantments.enchantment; import org.bukkit.entity.player; import org.bukkit.event.eventhandler; import org.bukkit.event.player.playerquitevent; import org.bukkit.inventory.itemstack; import org.bukkit.potion.potioneffect;  import java.util.arraylist; import java.util.list;  public class agilitylistener extends enchantmentlistener{      private list<player> players = new arraylist<>();      public agilitylistener() {         super(enchantment.getbyname("agility"), enchantmentrarity.very_rare);         starttimer();     }      @eventhandler     public void onquit(playerquitevent event) {         player player = event.getplayer();         if (players.contains(player)) {             players.remove(player);         }     }      private void starttimer() {         final potioneffect effect = mainconfig.getagilityeffect();         instance.getserver().getscheduler().schedulesyncrepeatingtask(instance, new runnable() {             @override             public void run() {                 (player player : instance.getserver().getonlineplayers()) {                     itemstack boots = player.getinventory().getboots();                     if (boots != null && boots.containsenchantment(enchantment)) {                         player.addpotioneffect(effect);                         players.add(player);                     } else if (players.contains(player)) {                         player.removepotioneffect(effect.gettype());                         players.remove(player);                     }                 }             }         }, 10l, 10l);     } } 

the error not occur if remove starttimer() method. why happen?

the problem you're not trying construct instance of agilitylistener - you're trying construct instance of anonymous inner class created in agilitylistener.starttimer. that's why stack trace has:

caused by: java.lang.nosuchmethodexception: cullan.listener.agilitylistener$1.<init>() 

the "$1" shows it's anonymous inner class.

if want filter out nested/inner classes, expand check on class name:

if (!listenerclass.getsimplename().equals("enchantmentlistener") &&     !listenerclass.getsimplename().contains("$"))  

or:

!listenerclass.isanonymousclass() 

etc. check whether class has public parameterless constructor, , it's assignable enchantmentlistener.


Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -

How to provide Authorization & Authentication using Asp.net, C#? -