From 1ce19a564bed2aa29089d24b32188e67136f453b Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 21 Aug 2020 03:32:39 +0200 Subject: [PATCH] replace wall of text that was registering listeners with a nice loop --- pom.xml | 5 ++ .../eu/endermite/togglepvp/TogglePvP.java | 46 ++++++++++--------- .../player/PlayerAttackListener.java | 1 + .../player/PlayerHitByExplosionListener.java | 3 +- .../player/PlayerHitByFireworkListener.java | 1 + .../player/PlayerHitByProjectileListener.java | 1 + .../PlayerHitBySplashPotionListener.java | 1 + .../player/PlayerJoinAndLeaveListener.java | 2 +- .../player/WolfAttackPlayerListener.java | 1 + .../AreaEffectCloudApplyListener.java | 2 +- .../EntityHitByLightningListener.java | 1 + .../listeners/unspecific/FishingListener.java | 1 + .../unspecific/LavaDumpAndIgniteListener.java | 2 + .../LightningBlockIgniteListener.java | 1 + .../unspecific/PlaceWitherRoseListener.java | 1 + .../wolf/PlayerAttackWolfListener.java | 1 + .../wolf/PlayerHitWolfWithProjectile.java | 1 + .../wolf/WolfHitByExplosionListener.java | 3 +- .../wolf/WolfHitByFireworkListener.java | 1 + .../wolf/WolfHitBySplashPotionListener.java | 1 + .../listeners/wolf/WolfLeashListener.java | 1 + .../wolf/WolfTargettingPlayerListener.java | 2 +- .../wolf/WolfTargettingWolfListener.java | 1 + .../togglepvp/util/DatabaseSQLite.java | 4 +- .../eu/endermite/togglepvp/util/Listener.java | 11 +++++ 25 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 src/main/java/eu/endermite/togglepvp/util/Listener.java diff --git a/pom.xml b/pom.xml index 6cc8cf1..974e19a 100644 --- a/pom.xml +++ b/pom.xml @@ -77,5 +77,10 @@ 1.18.12 provided + + org.reflections + reflections + 0.9.12 + diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvP.java b/src/main/java/eu/endermite/togglepvp/TogglePvP.java index a9e87aa..ba2f525 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvP.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvP.java @@ -9,13 +9,18 @@ import eu.endermite.togglepvp.listeners.unspecific.*; import eu.endermite.togglepvp.listeners.wolf.*; import eu.endermite.togglepvp.players.PlayerManager; import eu.endermite.togglepvp.players.SmartCache; +import eu.endermite.togglepvp.util.Listener; import eu.endermite.togglepvp.util.DatabaseSQLite; import lombok.Getter; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; +import org.reflections.Reflections; +import org.reflections.scanners.TypeAnnotationsScanner; import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.util.Objects; +import java.util.Set; public final class TogglePvP extends JavaPlugin { @@ -31,33 +36,30 @@ public final class TogglePvP extends JavaPlugin { File dbFile = new File("plugins/TogglePvP"); sqLite = new DatabaseSQLite("jdbc:sqlite:plugins/TogglePvP/TogglePvP.db", dbFile); sqLite.createDatabaseFile(); - sqLite.testConnection(); + if (!sqLite.testConnection()) { + getLogger().severe("Error with accessing database."); + getLogger().severe("Plugin will now disable."); + getServer().getPluginManager().disablePlugin(this); + } playerManager = new PlayerManager(); SmartCache.runSmartCache(); - getServer().getPluginManager().registerEvents(new PlayerJoinAndLeaveListener(), this); - getServer().getPluginManager().registerEvents(new PlayerAttackListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitByProjectileListener(), this); - getServer().getPluginManager().registerEvents(new AreaEffectCloudApplyListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitBySplashPotionListener(), this); - getServer().getPluginManager().registerEvents(new EntityHitByLightningListener(), this); - getServer().getPluginManager().registerEvents(new LightningBlockIgniteListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitByFireworkListener(), this); - getServer().getPluginManager().registerEvents(new FishingListener(), this); - getServer().getPluginManager().registerEvents(new LavaDumpAndIgniteListener(), this); - getServer().getPluginManager().registerEvents(new PlaceWitherRoseListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitByExplosionListener(), this); - getServer().getPluginManager().registerEvents(new WolfTargettingPlayerListener(), this); - getServer().getPluginManager().registerEvents(new WolfAttackPlayerListener(), this); - getServer().getPluginManager().registerEvents(new PlayerAttackWolfListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitWolfWithProjectile(), this); - getServer().getPluginManager().registerEvents(new WolfHitBySplashPotionListener(), this); - getServer().getPluginManager().registerEvents(new WolfHitByFireworkListener(), this); - getServer().getPluginManager().registerEvents(new WolfTargettingWolfListener(), this); - getServer().getPluginManager().registerEvents(new WolfHitByExplosionListener(), this); - getServer().getPluginManager().registerEvents(new WolfLeashListener(), this); + // Register listeners + Reflections reflections = new Reflections(new String[]{"eu.endermite.togglepvp"}); + Set> listenerClasses = reflections.getTypesAnnotatedWith(Listener.class); + listenerClasses.forEach((listener)-> { + try { + getServer().getPluginManager().registerEvents((org.bukkit.event.Listener) listener.getConstructor().newInstance(), this); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + getLogger().severe("Error with registering listeners."); + getLogger().severe("Plugin will now disable."); + getServer().getPluginManager().disablePlugin(this); + } + }); + // Register command Objects.requireNonNull(getCommand("pvp")).setExecutor(new MainCommand()); Objects.requireNonNull(getCommand("pvp")).setTabCompleter(new MainCommand()); } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java index b947a2e..7709e38 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class PlayerAttackListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java index 08d99dd..4a0d116 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java @@ -11,10 +11,9 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.metadata.FixedMetadataValue; - import java.util.UUID; - +@eu.endermite.togglepvp.util.Listener public class PlayerHitByExplosionListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java index c4da785..ed5283a 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java @@ -8,6 +8,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class PlayerHitByFireworkListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java index 7e1dc89..cd7487b 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class PlayerHitByProjectileListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java index ce69e6c..f4797e2 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java @@ -11,6 +11,7 @@ import org.bukkit.event.Listener; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +@eu.endermite.togglepvp.util.Listener public class PlayerHitBySplashPotionListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java index d81bd0d..78f114f 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java @@ -4,9 +4,9 @@ import eu.endermite.togglepvp.TogglePvP; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; - import java.util.HashMap; +@eu.endermite.togglepvp.util.Listener public class PlayerJoinAndLeaveListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java index cd513b5..c89246a 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java @@ -8,6 +8,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class WolfAttackPlayerListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java index e22c952..d2d97d1 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java @@ -11,9 +11,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.AreaEffectCloudApplyEvent; import org.bukkit.potion.PotionEffectType; - import java.util.Iterator; +@eu.endermite.togglepvp.util.Listener public class AreaEffectCloudApplyListener implements Listener { @EventHandler(ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java index dd67a16..e13d375 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java @@ -15,6 +15,7 @@ import org.bukkit.metadata.FixedMetadataValue; * Listen for lightning strikes and tag the trident spawned ones. * Idea from aasmus' PvPToggle plugin */ +@eu.endermite.togglepvp.util.Listener public class EntityHitByLightningListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java index 3b0ff1b..a724a07 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class FishingListener implements Listener { ConfigCache config = TogglePvP.getPlugin().getConfigCache(); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java index 4475aa1..5a03ede 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java @@ -15,6 +15,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.util.BoundingBox; + +@eu.endermite.togglepvp.util.Listener public class LavaDumpAndIgniteListener implements Listener { private ConfigCache config = TogglePvP.getPlugin().getConfigCache(); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java index a52a813..b90cfd1 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class LightningBlockIgniteListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java index 4decdca..3c037e8 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java @@ -15,6 +15,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.util.BoundingBox; +@eu.endermite.togglepvp.util.Listener public class PlaceWitherRoseListener implements Listener { private ConfigCache config = TogglePvP.getPlugin().getConfigCache(); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java index 6fd8c7b..bb09928 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class PlayerAttackWolfListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java index 4dd80e6..21e2862 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java @@ -11,6 +11,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class PlayerHitWolfWithProjectile implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java index a27f5aa..efb2c13 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java @@ -4,15 +4,14 @@ import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.PluginMessages; -import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; - import java.util.UUID; +@eu.endermite.togglepvp.util.Listener public class WolfHitByExplosionListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java index a8763ed..271eb3c 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class WolfHitByFireworkListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java index fd816b9..9dfb625 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java @@ -13,6 +13,7 @@ import org.bukkit.event.Listener; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +@eu.endermite.togglepvp.util.Listener public class WolfHitBySplashPotionListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfLeashListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfLeashListener.java index 9be6399..ffd5c28 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfLeashListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfLeashListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class WolfLeashListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java index f0a8786..1e01116 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java @@ -2,13 +2,13 @@ package eu.endermite.togglepvp.listeners.wolf; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.players.SmartCache; -import org.bukkit.entity.Fox; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class WolfTargettingPlayerListener implements Listener { /** * Stops wolves with owners targetting players with pvp off diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingWolfListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingWolfListener.java index 9b54246..f11b428 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingWolfListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingWolfListener.java @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +@eu.endermite.togglepvp.util.Listener public class WolfTargettingWolfListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java index cf23134..d217d92 100644 --- a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java +++ b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java @@ -36,7 +36,7 @@ public class DatabaseSQLite { return true; } - public void testConnection() { + public boolean testConnection() { Connection conn = null; try { conn = DriverManager.getConnection(url); @@ -48,10 +48,12 @@ public class DatabaseSQLite { if (conn != null) { conn.close(); } + return true; } catch (SQLException ex) { System.out.println(ex.getMessage()); } } + return false; } public HashMap getPlayerInfo(UUID uuid) { diff --git a/src/main/java/eu/endermite/togglepvp/util/Listener.java b/src/main/java/eu/endermite/togglepvp/util/Listener.java new file mode 100644 index 0000000..9731a8c --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/util/Listener.java @@ -0,0 +1,11 @@ +package eu.endermite.togglepvp.util; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) + +public @interface Listener {}