<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mineplugin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laxcat</id>
	<title>Minecraft插件百科 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://mineplugin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Laxcat"/>
	<link rel="alternate" type="text/html" href="https://mineplugin.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Laxcat"/>
	<updated>2026-04-08T10:25:34Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=14674</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=14674"/>
		<updated>2021-05-19T11:14:13Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 废柴&lt;br /&gt;
*能够编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 搜索你插件中所有特定包开头的class文件 ===&lt;br /&gt;
[https://github.com/q513902026/HopeCore/blob/main/src/main/java/me/hope/core/inject/InjectFinder.java#L21-L51 InjectFinder]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@NotSinglethon&lt;br /&gt;
public class InjectFinder {&lt;br /&gt;
    private static JarFile jarfile;&lt;br /&gt;
    public static &amp;lt;T extends JavaPlugin&amp;gt; Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getClasses(T plugin, String rootPackage, boolean recursive)  {&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        String packDirName = rootPackage.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
        Enumeration&amp;lt;URL&amp;gt; dirs;&lt;br /&gt;
        try{&lt;br /&gt;
            dirs = plugin.getClass().getClassLoader().getResources(packDirName);&lt;br /&gt;
            while(dirs.hasMoreElements()){&lt;br /&gt;
                URL url = dirs.nextElement();&lt;br /&gt;
                String protocol = url.getProtocol();&lt;br /&gt;
                switch(protocol){&lt;br /&gt;
                    case &amp;quot;file&amp;quot;:&lt;br /&gt;
                        String filePath = URLDecoder.decode(url.getFile(),&amp;quot;UTF-8&amp;quot;);&lt;br /&gt;
                        classes.addAll(findClassesByFile(rootPackage,filePath,recursive));&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &amp;quot;jar&amp;quot;:&lt;br /&gt;
                        JarURLConnection conn = (JarURLConnection) url.openConnection();&lt;br /&gt;
                        JarFile jar = conn.getJarFile();&lt;br /&gt;
                        if (jar == null){&lt;br /&gt;
                            jar = jarfile;&lt;br /&gt;
                        }else{&lt;br /&gt;
                            jarfile = jar;&lt;br /&gt;
                        }&lt;br /&gt;
                        classes.addAll(findClassesByJar(rootPackage,jar,recursive));&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }catch(IOException e){&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; findClassesByJar(String rootPackage,JarFile jarFile,boolean recursive){&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        Enumeration&amp;lt;JarEntry&amp;gt; jarEntryEnumeration = jarFile.entries();&lt;br /&gt;
        String packDirName = rootPackage.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
        while(jarEntryEnumeration.hasMoreElements()){&lt;br /&gt;
            JarEntry jarEntry = jarEntryEnumeration.nextElement();&lt;br /&gt;
            String name = jarEntry.getName();&lt;br /&gt;
            if(&#039;/&#039; == name.charAt(0)){&lt;br /&gt;
                name = name.substring(1);&lt;br /&gt;
            }&lt;br /&gt;
            if(name.startsWith(packDirName)){&lt;br /&gt;
                int index = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
                if(index != -1 ){&lt;br /&gt;
                    rootPackage = name.substring(0,index).replace(&#039;/&#039;,&#039;.&#039;);&lt;br /&gt;
                }&lt;br /&gt;
                if((index != -1) || recursive){&lt;br /&gt;
                    if(name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !(jarEntry.isDirectory())){&lt;br /&gt;
                        String className = name.substring(rootPackage.length()+1,name.length()-6);&lt;br /&gt;
                        try {&lt;br /&gt;
                            Class clazz = getClass(rootPackage,className);&lt;br /&gt;
                            if (clazz != null){&lt;br /&gt;
                                classes.add(clazz);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (ClassNotFoundException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; findClassesByFile(String rootPackage,String filePath,boolean recursive){&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        findAndAddClasses(rootPackage,filePath,recursive,classes);&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static void findAndAddClasses(String rootPackage,String filePath,boolean recursive,Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes){&lt;br /&gt;
        File dir = new File(rootPackage);&lt;br /&gt;
        if(!dir.exists() || !dir.isDirectory()){&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        File[] dirFiles = dir.listFiles(pathname -&amp;gt; (recursive &amp;amp;&amp;amp; pathname.isDirectory()) || (pathname.getName().endsWith(&amp;quot;.class&amp;quot;)));&lt;br /&gt;
        for(File file:dirFiles){&lt;br /&gt;
            if(file.isDirectory()){&lt;br /&gt;
                findAndAddClasses(rootPackage+&amp;quot;.&amp;quot;+file.getName(),file.getAbsolutePath(),recursive,classes);&lt;br /&gt;
            }else{&lt;br /&gt;
                String className =file.getName().substring(0,file.getName().length()-6);&lt;br /&gt;
                try{&lt;br /&gt;
                    Class clazz = getClass(rootPackage,className);&lt;br /&gt;
                    if (clazz != null){&lt;br /&gt;
                        classes.add(clazz);&lt;br /&gt;
                    }&lt;br /&gt;
                } catch (ClassNotFoundException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    private static Class&amp;lt;?&amp;gt; getClass(String rootPackage,String className) throws ClassNotFoundException {&lt;br /&gt;
        Class clazz = Class.forName(rootPackage + &#039;.&#039; + className);&lt;br /&gt;
        return clazz.isAnnotationPresent(NotSinglethon.class) ? null:clazz;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
使用方法&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = InjectFinder.getClasses(pluginInstance,&amp;quot;packageName&amp;quot;,isRecursive)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
pluginInstance 需要你自己插件的实例 &lt;br /&gt;
packageName 指搜索的指定包的文件&lt;br /&gt;
isRecursive 指是否循环&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
BaseListener.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Example BaseListener ====&lt;br /&gt;
&amp;lt;source  lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.Chunk;&lt;br /&gt;
import org.bukkit.entity.Entity;&lt;br /&gt;
import org.bukkit.entity.Zombie;&lt;br /&gt;
import org.bukkit.event.EventHandler;&lt;br /&gt;
import org.bukkit.event.world.ChunkUnloadEvent;&lt;br /&gt;
/**&lt;br /&gt;
 * 管理实体的监听器&lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class EntityListener extends BaseListener {&lt;br /&gt;
    private static boolean debug = false;&lt;br /&gt;
    public EntityListener() {&lt;br /&gt;
	super(&amp;quot;EntityListener&amp;quot;,&amp;quot;v0.1.0&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    @EventHandler&lt;br /&gt;
    public void onChunkUnloadEvent(ChunkUnloadEvent event) {&lt;br /&gt;
	Chunk chunk = event.getChunk();&lt;br /&gt;
	for (Entity entity : chunk.getEntities()) {&lt;br /&gt;
	    if (isClearEntity(entity)) {&lt;br /&gt;
		if (debug) {&lt;br /&gt;
		    sendConsoleMessage(&amp;quot;Entity: &amp;quot; + entity.getType() + &amp;quot;Location:{x:&amp;quot; + (int) entity.getLocation().getX()&lt;br /&gt;
			    + &amp;quot;,y:&amp;quot; + (int) entity.getLocation().getY() + &amp;quot;,z:&amp;quot; + (int) entity.getLocation().getZ()&lt;br /&gt;
			    + &amp;quot;}&amp;quot;);&lt;br /&gt;
		    ;&lt;br /&gt;
		}&lt;br /&gt;
		entity.remove();&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    public static boolean isClearEntity(Entity entity) {&lt;br /&gt;
	    switch (entity.getType()) {&lt;br /&gt;
&lt;br /&gt;
	    case ZOMBIE:&lt;br /&gt;
		if (((Zombie) entity).isVillager()) {&lt;br /&gt;
		    return false;&lt;br /&gt;
		}&lt;br /&gt;
	    case CREEPER:&lt;br /&gt;
	    case SKELETON:&lt;br /&gt;
	    case SPIDER:&lt;br /&gt;
	    case CAVE_SPIDER:&lt;br /&gt;
	    case SQUID:&lt;br /&gt;
	    case PIG_ZOMBIE:&lt;br /&gt;
		return true;&lt;br /&gt;
	    default:&lt;br /&gt;
		break;&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
BiliBS.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=14669</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=14669"/>
		<updated>2021-05-19T11:06:28Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 废柴&lt;br /&gt;
*能够编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 搜索你插件中所有特定包开头的class文件 ===&lt;br /&gt;
[https://github.com/q513902026/HopeCore/blob/main/src/main/java/me/hope/core/inject/InjectFinder.java#L21-L51 InjectFinder]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@NotSinglethon&lt;br /&gt;
public class InjectFinder {&lt;br /&gt;
    private static JarFile jarfile;&lt;br /&gt;
    public static &amp;lt;T extends JavaPlugin&amp;gt; Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getClasses(T plugin, String rootPackage, boolean recursive)  {&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        String packDirName = rootPackage.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
        Enumeration&amp;lt;URL&amp;gt; dirs;&lt;br /&gt;
        try{&lt;br /&gt;
            dirs = plugin.getClass().getClassLoader().getResources(packDirName);&lt;br /&gt;
            while(dirs.hasMoreElements()){&lt;br /&gt;
                URL url = dirs.nextElement();&lt;br /&gt;
                String protocol = url.getProtocol();&lt;br /&gt;
                switch(protocol){&lt;br /&gt;
                    case &amp;quot;file&amp;quot;:&lt;br /&gt;
                        String filePath = URLDecoder.decode(url.getFile(),&amp;quot;UTF-8&amp;quot;);&lt;br /&gt;
                        classes.addAll(findClassesByFile(rootPackage,filePath,recursive));&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &amp;quot;jar&amp;quot;:&lt;br /&gt;
                        JarURLConnection conn = (JarURLConnection) url.openConnection();&lt;br /&gt;
                        JarFile jar = conn.getJarFile();&lt;br /&gt;
                        if (jar == null){&lt;br /&gt;
                            jar = jarfile;&lt;br /&gt;
                        }else{&lt;br /&gt;
                            jarfile = jar;&lt;br /&gt;
                        }&lt;br /&gt;
                        classes.addAll(findClassesByJar(rootPackage,jar,recursive));&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }catch(IOException e){&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; findClassesByJar(String rootPackage,JarFile jarFile,boolean recursive){&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        Enumeration&amp;lt;JarEntry&amp;gt; jarEntryEnumeration = jarFile.entries();&lt;br /&gt;
        String packDirName = rootPackage.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
        while(jarEntryEnumeration.hasMoreElements()){&lt;br /&gt;
            JarEntry jarEntry = jarEntryEnumeration.nextElement();&lt;br /&gt;
            String name = jarEntry.getName();&lt;br /&gt;
            if(&#039;/&#039; == name.charAt(0)){&lt;br /&gt;
                name = name.substring(1);&lt;br /&gt;
            }&lt;br /&gt;
            if(name.startsWith(packDirName)){&lt;br /&gt;
                int index = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
                if(index != -1 ){&lt;br /&gt;
                    rootPackage = name.substring(0,index).replace(&#039;/&#039;,&#039;.&#039;);&lt;br /&gt;
                }&lt;br /&gt;
                if((index != -1) || recursive){&lt;br /&gt;
                    if(name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !(jarEntry.isDirectory())){&lt;br /&gt;
                        String className = name.substring(rootPackage.length()+1,name.length()-6);&lt;br /&gt;
                        try {&lt;br /&gt;
                            Class clazz = getClass(rootPackage,className);&lt;br /&gt;
                            if (clazz != null){&lt;br /&gt;
                                classes.add(clazz);&lt;br /&gt;
                            }&lt;br /&gt;
                        } catch (ClassNotFoundException e) {&lt;br /&gt;
                            e.printStackTrace();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; findClassesByFile(String rootPackage,String filePath,boolean recursive){&lt;br /&gt;
        Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = Sets.newHashSet();&lt;br /&gt;
        findAndAddClasses(rootPackage,filePath,recursive,classes);&lt;br /&gt;
        return classes;&lt;br /&gt;
    }&lt;br /&gt;
    private static void findAndAddClasses(String rootPackage,String filePath,boolean recursive,Collection&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes){&lt;br /&gt;
        File dir = new File(rootPackage);&lt;br /&gt;
        if(!dir.exists() || !dir.isDirectory()){&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        File[] dirFiles = dir.listFiles(pathname -&amp;gt; (recursive &amp;amp;&amp;amp; pathname.isDirectory()) || (pathname.getName().endsWith(&amp;quot;.class&amp;quot;)));&lt;br /&gt;
        for(File file:dirFiles){&lt;br /&gt;
            if(file.isDirectory()){&lt;br /&gt;
                findAndAddClasses(rootPackage+&amp;quot;.&amp;quot;+file.getName(),file.getAbsolutePath(),recursive,classes);&lt;br /&gt;
            }else{&lt;br /&gt;
                String className =file.getName().substring(0,file.getName().length()-6);&lt;br /&gt;
                try{&lt;br /&gt;
                    Class clazz = getClass(rootPackage,className);&lt;br /&gt;
                    if (clazz != null){&lt;br /&gt;
                        classes.add(clazz);&lt;br /&gt;
                    }&lt;br /&gt;
                } catch (ClassNotFoundException e) {&lt;br /&gt;
                    e.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    private static Class&amp;lt;?&amp;gt; getClass(String rootPackage,String className) throws ClassNotFoundException {&lt;br /&gt;
        Class clazz = Class.forName(rootPackage + &#039;.&#039; + className);&lt;br /&gt;
        return clazz.isAnnotationPresent(NotSinglethon.class) ? null:clazz;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
使用方法&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = InjectFinder.getClasses(pluginInstance,&amp;quot;packageName&amp;quot;,isRecursive)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
pluginInstance 需要你自己插件的实例 &lt;br /&gt;
packageName 指搜索的指定包的文件&lt;br /&gt;
isRecursive 指是否循环&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
BaseListener.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Example BaseListener ====&lt;br /&gt;
&amp;lt;source  lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.Chunk;&lt;br /&gt;
import org.bukkit.entity.Entity;&lt;br /&gt;
import org.bukkit.entity.Zombie;&lt;br /&gt;
import org.bukkit.event.EventHandler;&lt;br /&gt;
import org.bukkit.event.world.ChunkUnloadEvent;&lt;br /&gt;
/**&lt;br /&gt;
 * 管理实体的监听器&lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class EntityListener extends BaseListener {&lt;br /&gt;
    private static boolean debug = false;&lt;br /&gt;
    public EntityListener() {&lt;br /&gt;
	super(&amp;quot;EntityListener&amp;quot;,&amp;quot;v0.1.0&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    @EventHandler&lt;br /&gt;
    public void onChunkUnloadEvent(ChunkUnloadEvent event) {&lt;br /&gt;
	Chunk chunk = event.getChunk();&lt;br /&gt;
	for (Entity entity : chunk.getEntities()) {&lt;br /&gt;
	    if (isClearEntity(entity)) {&lt;br /&gt;
		if (debug) {&lt;br /&gt;
		    sendConsoleMessage(&amp;quot;Entity: &amp;quot; + entity.getType() + &amp;quot;Location:{x:&amp;quot; + (int) entity.getLocation().getX()&lt;br /&gt;
			    + &amp;quot;,y:&amp;quot; + (int) entity.getLocation().getY() + &amp;quot;,z:&amp;quot; + (int) entity.getLocation().getZ()&lt;br /&gt;
			    + &amp;quot;}&amp;quot;);&lt;br /&gt;
		    ;&lt;br /&gt;
		}&lt;br /&gt;
		entity.remove();&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    public static boolean isClearEntity(Entity entity) {&lt;br /&gt;
	    switch (entity.getType()) {&lt;br /&gt;
&lt;br /&gt;
	    case ZOMBIE:&lt;br /&gt;
		if (((Zombie) entity).isVillager()) {&lt;br /&gt;
		    return false;&lt;br /&gt;
		}&lt;br /&gt;
	    case CREEPER:&lt;br /&gt;
	    case SKELETON:&lt;br /&gt;
	    case SPIDER:&lt;br /&gt;
	    case CAVE_SPIDER:&lt;br /&gt;
	    case SQUID:&lt;br /&gt;
	    case PIG_ZOMBIE:&lt;br /&gt;
		return true;&lt;br /&gt;
	    default:&lt;br /&gt;
		break;&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
BiliBS.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2876</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2876"/>
		<updated>2016-03-12T12:28:19Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 继承此类自动在实例化时注册监听器 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
特定包 请把io.bilicraft.r6.bbs更改&lt;br /&gt;
特定jar文件 请把getBaseListenerClasses方法中的jar的FilePath更改为你需要检测的jar文件&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
BaseListener.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Example BaseListener ====&lt;br /&gt;
&amp;lt;source  lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.Chunk;&lt;br /&gt;
import org.bukkit.entity.Entity;&lt;br /&gt;
import org.bukkit.entity.Zombie;&lt;br /&gt;
import org.bukkit.event.EventHandler;&lt;br /&gt;
import org.bukkit.event.world.ChunkUnloadEvent;&lt;br /&gt;
/**&lt;br /&gt;
 * 管理实体的监听器&lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class EntityListener extends BaseListener {&lt;br /&gt;
    private static boolean debug = false;&lt;br /&gt;
    public EntityListener() {&lt;br /&gt;
	super(&amp;quot;EntityListener&amp;quot;,&amp;quot;v0.1.0&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    @EventHandler&lt;br /&gt;
    public void onChunkUnloadEvent(ChunkUnloadEvent event) {&lt;br /&gt;
	Chunk chunk = event.getChunk();&lt;br /&gt;
	for (Entity entity : chunk.getEntities()) {&lt;br /&gt;
	    if (isClearEntity(entity)) {&lt;br /&gt;
		if (debug) {&lt;br /&gt;
		    sendConsoleMessage(&amp;quot;Entity: &amp;quot; + entity.getType() + &amp;quot;Location:{x:&amp;quot; + (int) entity.getLocation().getX()&lt;br /&gt;
			    + &amp;quot;,y:&amp;quot; + (int) entity.getLocation().getY() + &amp;quot;,z:&amp;quot; + (int) entity.getLocation().getZ()&lt;br /&gt;
			    + &amp;quot;}&amp;quot;);&lt;br /&gt;
		    ;&lt;br /&gt;
		}&lt;br /&gt;
		entity.remove();&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    public static boolean isClearEntity(Entity entity) {&lt;br /&gt;
	    switch (entity.getType()) {&lt;br /&gt;
&lt;br /&gt;
	    case ZOMBIE:&lt;br /&gt;
		if (((Zombie) entity).isVillager()) {&lt;br /&gt;
		    return false;&lt;br /&gt;
		}&lt;br /&gt;
	    case CREEPER:&lt;br /&gt;
	    case SKELETON:&lt;br /&gt;
	    case SPIDER:&lt;br /&gt;
	    case CAVE_SPIDER:&lt;br /&gt;
	    case SQUID:&lt;br /&gt;
	    case PIG_ZOMBIE:&lt;br /&gt;
		return true;&lt;br /&gt;
	    default:&lt;br /&gt;
		break;&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
BiliBS.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2875</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2875"/>
		<updated>2016-03-12T12:26:45Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 对所有继承BaseListener的实例进行操作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
特定包 请把io.bilicraft.r6.bbs更改&lt;br /&gt;
特定jar文件 请把getBaseListenerClasses方法中的jar的FilePath更改为你需要检测的jar文件&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
BaseListener.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
BiliBS.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2874</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2874"/>
		<updated>2016-03-12T12:26:30Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 继承此类自动在实例化时注册监听器 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
特定包 请把io.bilicraft.r6.bbs更改&lt;br /&gt;
特定jar文件 请把getBaseListenerClasses方法中的jar的FilePath更改为你需要检测的jar文件&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
BaseListener.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2873</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2873"/>
		<updated>2016-03-12T12:25:34Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
特定包 请把io.bilicraft.r6.bbs更改&lt;br /&gt;
特定jar文件 请把getBaseListenerClasses方法中的jar的FilePath更改为你需要检测的jar文件&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2872</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2872"/>
		<updated>2016-03-12T12:23:32Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 对所有继承BaseListener的实例进行操作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.ChatColor;&lt;br /&gt;
import org.bukkit.command.Command;&lt;br /&gt;
import org.bukkit.command.CommandSender;&lt;br /&gt;
import org.bukkit.event.HandlerList;&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class BiliBS extends JavaPlugin implements Listener {&lt;br /&gt;
    private static BiliBS instance;&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; enableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
    private static HashMap&amp;lt;String, BaseListener&amp;gt; disableListenerList = new HashMap&amp;lt;String, BaseListener&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
	instance = this;&lt;br /&gt;
	try {&lt;br /&gt;
	    ListenerFactory.main(null);&lt;br /&gt;
	} catch (Exception e) {&lt;br /&gt;
	    getLogger().info(&amp;quot;加载监听类错误&amp;quot; + e.getClass().getName());&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	getServer().getPluginManager().registerEvents(this, this);&lt;br /&gt;
	// System.out.println(&amp;quot;[&amp;quot;+BiliBS.class.getName()+&amp;quot;]:&lt;br /&gt;
	// &amp;quot;+getServer().getBukkitVersion());&lt;br /&gt;
	registerListeners();&lt;br /&gt;
	registerCommands();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDisable() {&lt;br /&gt;
	instance = null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static BiliBS getInstance() {&lt;br /&gt;
	return instance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void registerCommands() {&lt;br /&gt;
	getCommand(&amp;quot;bilibs&amp;quot;).setExecutor(new BilibsCommand());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void registerListeners() {&lt;br /&gt;
	for (BaseListener listener : enableListenerList.values()) {&lt;br /&gt;
	    getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void registerListener(BaseListener baseListener) throws Exception {&lt;br /&gt;
	if (disableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    disableListenerList.remove(baseListener.getName(), baseListener);&lt;br /&gt;
&lt;br /&gt;
	    BaseListener listener = baseListener.getClass().newInstance();&lt;br /&gt;
	    BiliBS.getInstance().getServer().getPluginManager().registerEvents(listener, instance);&lt;br /&gt;
	    BiliBS.getInstance().getLogger().info(&amp;quot;Listener:&amp;quot; + listener.getName() + &amp;quot;&amp;lt;&amp;quot; + listener.getVersion() + &amp;quot;&amp;gt;&amp;quot; + &amp;quot;注册完成 ,debug:&amp;quot;&lt;br /&gt;
		    + listener.isDebug());&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void addListener(String name, BaseListener baseListener) {&lt;br /&gt;
	enableListenerList.put(name, baseListener);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void removeListener(BaseListener baseListener) {&lt;br /&gt;
	if (enableListenerList.containsKey(baseListener.getName())) {&lt;br /&gt;
	    enableListenerList.remove(baseListener.getName(),baseListener);&lt;br /&gt;
	    disableListenerList.put(baseListener.getName(), baseListener);&lt;br /&gt;
	    HandlerList.unregisterAll(baseListener);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static StringBuilder getListenerList() {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder(ChatColor.GREEN + &amp;quot;[BiliBS]: \nListenerList:&amp;quot;);&lt;br /&gt;
	sBuilder.append(&amp;quot;[&amp;quot;);&lt;br /&gt;
	for (String listenerName : enableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.GREEN + listenerName + &amp;quot;&amp;lt;&amp;quot;+enableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for (String listenerName : disableListenerList.keySet()) {&lt;br /&gt;
	    sBuilder.append(ChatColor.RED + listenerName + &amp;quot;&amp;lt;&amp;quot;+disableListenerList.get(listenerName).isDebug()+&amp;quot;&amp;gt;,&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	sBuilder.append(&amp;quot;]&amp;quot;);&lt;br /&gt;
	return sBuilder;&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getEnableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return enableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    public static BaseListener getDisableListener(String key)&lt;br /&gt;
    {&lt;br /&gt;
	return disableListenerList.get(key);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {&lt;br /&gt;
	&lt;br /&gt;
	return super.onCommand(sender, command, label, args);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2871</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2871"/>
		<updated>2016-03-12T12:23:10Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 继承此类自动在实例化时注册监听器 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;package io.bilicraft.r6.bbs.listener;&lt;br /&gt;
&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import org.bukkit.event.Listener;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.BiliBS;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 父类 继承后请设定为无参构造&lt;br /&gt;
 * &lt;br /&gt;
 * @author HopeAsd&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class BaseListener implements Listener {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private final String version;&lt;br /&gt;
    private Logger logger = BiliBS.getInstance().getLogger();&lt;br /&gt;
    private boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 请务必保证构造为无参构造 否则会注册失败&lt;br /&gt;
     * &lt;br /&gt;
     * @param name&lt;br /&gt;
     *            监听器的名字&lt;br /&gt;
     * @param version&lt;br /&gt;
     *            监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public BaseListener(String name, final String version) {&lt;br /&gt;
	this.name = name;&lt;br /&gt;
	this.version = version;&lt;br /&gt;
	BiliBS.addListener(name, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 调用此方法可以往服务端发送信息 自动标示监听器名字&lt;br /&gt;
     * &lt;br /&gt;
     * @param strings&lt;br /&gt;
     */&lt;br /&gt;
    protected void sendConsoleMessage(String... strings) {&lt;br /&gt;
	StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;
	for (String s : strings) {&lt;br /&gt;
	    sBuilder.append(s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logger.info(&amp;quot;[&amp;quot; + name + &amp;quot;]:&amp;quot; + sBuilder.toString());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 获取监听器版本&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器的版本&lt;br /&gt;
     */&lt;br /&gt;
    public final String getVersion() {&lt;br /&gt;
	return version;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 是否为debug输出模式&lt;br /&gt;
     * &lt;br /&gt;
     * @return 是否为debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public boolean isDebug() {&lt;br /&gt;
	return debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 更改debug输出模式&lt;br /&gt;
     */&lt;br /&gt;
    public void setDebug() {&lt;br /&gt;
	debug = !debug;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 使用此方法用于注册监听器和反注册监听器&lt;br /&gt;
     * &lt;br /&gt;
     * @return 监听器名字&lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
	return this.name;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2870</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2870"/>
		<updated>2016-03-12T12:14:31Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2869</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2869"/>
		<updated>2016-03-12T12:14:14Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
ListenerFactory.java&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package io.bilicraft.r6.bbs;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileFilter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.jar.JarEntry;&lt;br /&gt;
import java.util.jar.JarFile;&lt;br /&gt;
&lt;br /&gt;
import io.bilicraft.r6.bbs.listener.BaseListener;&lt;br /&gt;
&lt;br /&gt;
public class ListenerFactory {&lt;br /&gt;
    private static final boolean debug = false;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
	for (Class&amp;lt;?&amp;gt; clazz : getBaseListenerClasses(&amp;quot;io.bilicraft.r6.bbs&amp;quot;)) {&lt;br /&gt;
	    if (debug) {&lt;br /&gt;
		System.out.println(clazz.getSimpleName());&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    clazz.newInstance();&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 从包package中获取所有的BaseListener Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param pack&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; getBaseListenerClasses(String pack) {&lt;br /&gt;
&lt;br /&gt;
	// 第一个class类的集合&lt;br /&gt;
	Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;
	// 是否循环迭代&lt;br /&gt;
	boolean recursive = true;&lt;br /&gt;
	// 获取包的名字 并进行替换&lt;br /&gt;
	String packageName = pack;&lt;br /&gt;
	String packageDirName = packageName.replace(&#039;.&#039;, &#039;/&#039;);&lt;br /&gt;
	JarFile jar;&lt;br /&gt;
	try {&lt;br /&gt;
	    // 获取jar&lt;br /&gt;
	    /**&lt;br /&gt;
	     * Magic Value 输出文件名如果更改 请在这里修改&lt;br /&gt;
	     */&lt;br /&gt;
	    jar = new JarFile(new File(&amp;quot;.&amp;quot; + File.separator + &amp;quot;plugins&amp;quot; + File.separator + &amp;quot;BiliBS.jar&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	    // 从此jar包 得到一个枚举类&lt;br /&gt;
	    Enumeration&amp;lt;JarEntry&amp;gt; entries = jar.entries();&lt;br /&gt;
	    // 同样的进行循环迭代&lt;br /&gt;
	    while (entries.hasMoreElements()) {&lt;br /&gt;
		// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件&lt;br /&gt;
		JarEntry entry = entries.nextElement();&lt;br /&gt;
		String name = entry.getName();&lt;br /&gt;
		// 如果是以/开头的&lt;br /&gt;
		if (name.charAt(0) == &#039;/&#039;) {&lt;br /&gt;
		    // 获取后面的字符串&lt;br /&gt;
		    name = name.substring(1);&lt;br /&gt;
		}&lt;br /&gt;
		// 如果前半部分和定义的包名相同&lt;br /&gt;
		if (name.startsWith(packageDirName)) {&lt;br /&gt;
		    int idx = name.lastIndexOf(&#039;/&#039;);&lt;br /&gt;
		    // 如果以&amp;quot;/&amp;quot;结尾 是一个包&lt;br /&gt;
		    if (idx != -1) {&lt;br /&gt;
			// 获取包名 把&amp;quot;/&amp;quot;替换成&amp;quot;.&amp;quot;&lt;br /&gt;
			packageName = name.substring(0, idx).replace(&#039;/&#039;, &#039;.&#039;);&lt;br /&gt;
		    }&lt;br /&gt;
		    // 如果可以迭代下去 并且是一个包&lt;br /&gt;
		    if ((idx != -1) || recursive) {&lt;br /&gt;
			// 如果是一个.class文件 而且不是目录&lt;br /&gt;
			if (name.endsWith(&amp;quot;.class&amp;quot;) &amp;amp;&amp;amp; !entry.isDirectory()) {&lt;br /&gt;
			    // 去掉后面的&amp;quot;.class&amp;quot; 获取真正的类名&lt;br /&gt;
			    String className = name.substring(packageName.length() + 1, name.length() - 6);&lt;br /&gt;
			    try {&lt;br /&gt;
				Class&amp;lt;?&amp;gt; clasz = Class.forName(packageName + &#039;.&#039; + className);&lt;br /&gt;
				String superclazzName = BaseListener.class.getName();&lt;br /&gt;
				String superClasz = clasz.getSuperclass().getName();&lt;br /&gt;
				if (debug){&lt;br /&gt;
					System.out.println(&amp;quot;super:&amp;quot;+superClasz);&lt;br /&gt;
				}	&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				if (superClasz.equals(superclazzName)) {&lt;br /&gt;
				    if (!(clasz.getName().equals(superclazzName))) {&lt;br /&gt;
					&lt;br /&gt;
					classes.add(clasz);&lt;br /&gt;
				    }&lt;br /&gt;
				}&lt;br /&gt;
			    } catch (ClassNotFoundException e) {&lt;br /&gt;
				// log&lt;br /&gt;
				// .error(&amp;quot;添加用户自定义视图类错误&lt;br /&gt;
				// 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
				System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	} catch (IOException e) {&lt;br /&gt;
	    // log.error(&amp;quot;在扫描用户定义视图时从jar包获取文件出错&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;IO错误 找不到&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return classes;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 以文件的形式来获取包下的所有Class&lt;br /&gt;
     * &lt;br /&gt;
     * @param packageName&lt;br /&gt;
     * @param packagePath&lt;br /&gt;
     * @param recursive&lt;br /&gt;
     * @param classes&lt;br /&gt;
     */&lt;br /&gt;
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,&lt;br /&gt;
	    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; classes) {&lt;br /&gt;
	// 获取此包的目录 建立一个File&lt;br /&gt;
	File dir = new File(packagePath);&lt;br /&gt;
	// 如果不存在或者 也不是目录就直接返回&lt;br /&gt;
	if (!dir.exists() || !dir.isDirectory()) {&lt;br /&gt;
	    // log.warn(&amp;quot;用户定义包名 &amp;quot; + packageName + &amp;quot; 下没有任何文件&amp;quot;);&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	// 如果存在 就获取包下的所有文件 包括目录&lt;br /&gt;
	File[] dirfiles = dir.listFiles(new FileFilter() {&lt;br /&gt;
	    // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)&lt;br /&gt;
	    public boolean accept(File file) {&lt;br /&gt;
		return (recursive &amp;amp;&amp;amp; file.isDirectory()) || (file.getName().endsWith(&amp;quot;.class&amp;quot;));&lt;br /&gt;
	    }&lt;br /&gt;
	});&lt;br /&gt;
	// 循环所有文件&lt;br /&gt;
	for (File file : dirfiles) {&lt;br /&gt;
	    // 如果是目录 则继续扫描&lt;br /&gt;
	    if (file.isDirectory()) {&lt;br /&gt;
		findAndAddClassesInPackageByFile(packageName + &amp;quot;.&amp;quot; + file.getName(), file.getAbsolutePath(), recursive,&lt;br /&gt;
			classes);&lt;br /&gt;
	    } else {&lt;br /&gt;
		// 如果是java类文件 去掉后面的.class 只留下类名&lt;br /&gt;
		String className = file.getName().substring(0, file.getName().length() - 6);&lt;br /&gt;
		try {&lt;br /&gt;
		    // 添加到集合中去&lt;br /&gt;
		    // classes.add(Class.forName(packageName + &#039;.&#039; +&lt;br /&gt;
		    // className));&lt;br /&gt;
		    // 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净&lt;br /&gt;
		    classes.add(&lt;br /&gt;
			    Thread.currentThread().getContextClassLoader().loadClass(packageName + &#039;.&#039; + className));&lt;br /&gt;
		} catch (ClassNotFoundException e) {&lt;br /&gt;
		    // log.error(&amp;quot;添加用户自定义视图类错误 找不到此类的.class文件&amp;quot;);&lt;br /&gt;
		    System.out.println(&amp;quot;找不到类&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2868</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2868"/>
		<updated>2016-03-12T12:12:35Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 对所有继承BaseListener的实例进行操作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2867</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2867"/>
		<updated>2016-03-12T12:12:30Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 继承此类自动在实例化时注册监听器 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2866</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2866"/>
		<updated>2016-03-12T12:12:18Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2865</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2865"/>
		<updated>2016-03-12T12:11:07Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 个人信息 ==&lt;br /&gt;
*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;br /&gt;
== 代码预留地 ==&lt;br /&gt;
=== 自动搜索特定jar包中的特定包中的特定类(继承某个类)对其进行无参实例化 ===&lt;br /&gt;
&lt;br /&gt;
=== 继承此类自动在实例化时注册监听器 ===&lt;br /&gt;
&lt;br /&gt;
=== 对所有继承BaseListener的实例进行操作 ===&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2864</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2864"/>
		<updated>2016-03-12T12:06:34Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 写一个发送欢迎信息功能的插件 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本条目长期未更新，相关条目可前往 [[Bukkit/插件开发教程]]&lt;br /&gt;
{{待完善}}&lt;br /&gt;
== 插件编写 ==&lt;br /&gt;
=== 准备工作 ===&lt;br /&gt;
&lt;br /&gt;
==== 开始前须知 ====&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
==== 下载Bukkit API ====&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
下载地址 [http://pan.baidu.com/s/1mgyszMC 百度云]&lt;br /&gt;
[[Category:基本概念]]&lt;br /&gt;
==== 构建开发环境 ====&lt;br /&gt;
# 下载一款你喜欢的IDE&lt;br /&gt;
# 添加刚刚下载的lib库到你的IDE中 设为用户库 方便调用 详情请百度&lt;br /&gt;
# 找到你的IDE设置 更改全局Java编码设置 变更为UTF-8 这样方便使用中文&lt;br /&gt;
&lt;br /&gt;
=== 构思插件 ===&lt;br /&gt;
==== 插件类型 ====&lt;br /&gt;
* 在进行插件的编写前 我们需要好好考虑插件要做什么样的功能&lt;br /&gt;
* 依靠什么来实现&lt;br /&gt;
* 根据插件的实现方式和使用方式我们可以把插件分类为好几种&lt;br /&gt;
* DevBukkit页面上详细列出了种类&lt;br /&gt;
==== 插件实现原理 ====&lt;br /&gt;
* 对于插件的实现 最简单的无外乎使用Bukkit的Listener功能和Command功能&lt;br /&gt;
* 当你想好如何实现功能的时候就可以开始创建插件项目了&lt;br /&gt;
&lt;br /&gt;
=== 写一个发送欢迎信息功能的插件 ===&lt;br /&gt;
//对不起我这边写不下去了(23333 请转[http://blog.csdn.net/qq_20471725/article/details/39092143 外部链接]&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2863</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2863"/>
		<updated>2016-03-12T11:57:44Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 插件编写 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本条目长期未更新，相关条目可前往 [[Bukkit/插件开发教程]]&lt;br /&gt;
{{待完善}}&lt;br /&gt;
== 插件编写 ==&lt;br /&gt;
=== 准备工作 ===&lt;br /&gt;
&lt;br /&gt;
==== 开始前须知 ====&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
==== 下载Bukkit API ====&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
下载地址 [http://pan.baidu.com/s/1mgyszMC 百度云]&lt;br /&gt;
[[Category:基本概念]]&lt;br /&gt;
==== 构建开发环境 ====&lt;br /&gt;
# 下载一款你喜欢的IDE&lt;br /&gt;
# 添加刚刚下载的lib库到你的IDE中 设为用户库 方便调用 详情请百度&lt;br /&gt;
# 找到你的IDE设置 更改全局Java编码设置 变更为UTF-8 这样方便使用中文&lt;br /&gt;
&lt;br /&gt;
=== 构思插件 ===&lt;br /&gt;
==== 插件类型 ====&lt;br /&gt;
* 在进行插件的编写前 我们需要好好考虑插件要做什么样的功能&lt;br /&gt;
* 依靠什么来实现&lt;br /&gt;
* 根据插件的实现方式和使用方式我们可以把插件分类为好几种&lt;br /&gt;
* DevBukkit页面上详细列出了种类&lt;br /&gt;
==== 插件实现原理 ====&lt;br /&gt;
* 对于插件的实现 最简单的无外乎使用Bukkit的Listener功能和Command功能&lt;br /&gt;
* 当你想好如何实现功能的时候就可以开始创建插件项目了&lt;br /&gt;
&lt;br /&gt;
=== 写一个发送欢迎信息功能的插件 ===&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2862</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2862"/>
		<updated>2016-03-12T11:51:34Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
*能够熟练编写插件&lt;br /&gt;
*但是对于Java的了解不够深入&lt;br /&gt;
#MCBBS ID： q513902026&lt;br /&gt;
#Github ID: HopeAsd(q513902026)&lt;br /&gt;
#Github: [http://github.com/q513902026 我的GitHub页面]&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2861</id>
		<title>用户:Laxcat</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E7%94%A8%E6%88%B7:Laxcat&amp;diff=2861"/>
		<updated>2016-03-12T11:48:56Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​创建页面，内容为“一个业余的插件作者 自称废柴的家伙 能够熟练编写插件 但是对于Java的了解不够深入”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;一个业余的插件作者 自称废柴的家伙&lt;br /&gt;
能够熟练编写插件&lt;br /&gt;
但是对于Java的了解不够深入&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2860</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=2860"/>
		<updated>2016-03-12T11:45:15Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 构建开发环境 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本条目长期未更新，相关条目可前往 [[Bukkit/插件开发教程]]&lt;br /&gt;
{{待完善}}&lt;br /&gt;
== 插件编写 ==&lt;br /&gt;
=== 准备工作 ===&lt;br /&gt;
&lt;br /&gt;
==== 开始前须知 ====&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
==== 下载Bukkit API ====&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
下载地址 [http://pan.baidu.com/s/1mgyszMC 百度云]&lt;br /&gt;
[[Category:基本概念]]&lt;br /&gt;
==== 构建开发环境 ====&lt;br /&gt;
# 下载一款你喜欢的IDE&lt;br /&gt;
# 添加刚刚下载的lib库到你的IDE中 设为用户库 方便调用 详情请百度&lt;br /&gt;
# 找到你的IDE设置 更改全局Java编码设置 变更为UTF-8 这样方便使用中文&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=53</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=53"/>
		<updated>2014-09-05T16:39:23Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 下载Bukkit API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 准备工作 ==&lt;br /&gt;
&lt;br /&gt;
=== 开始前须知 ===&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
=== 下载Bukkit API ===&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
下载地址 [http://pan.baidu.com/s/1mgyszMC 百度云]&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=52</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=52"/>
		<updated>2014-09-05T16:39:04Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​/* 下载Bukkit API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 准备工作 ==&lt;br /&gt;
&lt;br /&gt;
=== 开始前须知 ===&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
=== 下载Bukkit API ===&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
   ;下载地址 &lt;br /&gt;
   : [http://pan.baidu.com/s/1mgyszMC 百度云]&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=51</id>
		<title>教程/Laxcat的插件编写教程</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=%E6%95%99%E7%A8%8B/Laxcat%E7%9A%84%E6%8F%92%E4%BB%B6%E7%BC%96%E5%86%99%E6%95%99%E7%A8%8B&amp;diff=51"/>
		<updated>2014-09-05T16:38:15Z</updated>

		<summary type="html">&lt;p&gt;Laxcat：​CraftBukkit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 准备工作 ==&lt;br /&gt;
&lt;br /&gt;
=== 开始前须知 ===&lt;br /&gt;
# 阅读本教程需要你有一定量的Java知识&lt;br /&gt;
# 本人因为第一次编写教程，所以教程可能并不完善。如果有错误你可以提出&lt;br /&gt;
# 教程是基于Minecraft 1.7.2 使用的API是Bukkit 1.7.2 - R0.2&lt;br /&gt;
&lt;br /&gt;
=== 下载Bukkit API ===&lt;br /&gt;
# 为了方便你寻找到本教程使用，我专门在国内的百度网盘上传了相关Bukkit文件&lt;br /&gt;
;下载地址&lt;br /&gt;
: 百度云&lt;/div&gt;</summary>
		<author><name>Laxcat</name></author>
	</entry>
</feed>