2014-02-26 2 views
0

그래서 누구나 폴더에 넣는 .jar 파일에서 특정 .class 파일을로드하려고 시도하기로했습니다. (지금은 내 Test.jar 만로드합니다.) 문제는 이러한 클래스가 자바 프로젝트에서 인터페이스를 구현한다는 것이며, 클래스 "Klass"는 그렇지 않다는 오류가 발생한다는 것입니다. 있다. 어떻게 로더가 자신의 것을 사용하는 대신 로더를로드 할 수 있습니까?인터페이스가 하위 클래스 .jar에 없을 때 하위 클래스 가져 오기

 String filePath = new String("C:/classes/Test.jar"); 

    URL myJarFile = null; 
      try { 
       myJarFile = new URL("file:///"+filePath); 

       URL[] urls = new URL[]{myJarFile}; 

       // Create a new class loader with the directory 
       ClassLoader cl = new URLClassLoader(urls); 

       // Load in the class; MyClass.class should be located in 
       // the directory file:/c:/myclasses/com/mycompan 
       Class cls = cl.loadClass("me.bluejelly.survivalgames.classes.Test"); 

       try { 
        Klass klass = (Klass) cls.newInstance(); 
        klass.create(arg0.getName()); 
        Main.listeners.put(arg0.getName(), klass); 
        Bukkit.getPluginManager().registerEvents(klass, instance); 
       } catch (InstantiationException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 

그리고 이것은 내가 해요 파일의 코드를 IT : 는 .JAR를로드하기 위해

코드를 (또한,이 내가이 사실이라면 난 아무 생각이 없다, 그것은 일을 생각 것입니다) 로드하려고 시도 :

package me.bluejelly.survivalgames.classes; 

import me.bluejelly.survivalgames.Main; 
import me.bluejelly.survivalgames.def.Klass; 

import org.bukkit.Bukkit; 
import org.bukkit.Material; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.HandlerList; 
import org.bukkit.event.player.PlayerMoveEvent; 
import org.bukkit.inventory.ItemStack; 

public class Test implements Klass { 

private String ownerName; 

@Override 
public void create(String pName) { 
    this.ownerName = pName; 
    Main.listeners.put(this.ownerName, this); 
} 

@Override 
public void destroy() { 
    if(Main.listeners.containsKey(this.ownerName)) { 
     Main.listeners.remove(ownerName); 
    } 
    HandlerList.unregisterAll(this); 
} 

@Override 
public Material getIcon() { 
    return null; 
} 

@Override 
public ItemStack[] getStartingItems() { 
    return null; 
} 

@EventHandler 
public void onPlayerMove(PlayerMoveEvent event) { 
    if(event.getPlayer().getName().equals(ownerName)) { 
     Bukkit.broadcastMessage("test"); 
    } 
} 

} 

답변

1

새 URLClassLoader의 부모로 기본 클래스 로더를 설정해야합니다. 그렇게하면 지역 클라스 강습반을들을 수 있습니다.

뭔가 같은 ...

ClassLoader cl = new URLClassLoader(urls, getClass().getClassLoader()); 
+0

오, 좋아. 내가 집에 갈 때 나는 그것을 시험 할 것이다. 나는 일하기 위해 서둘러야했다. – 9903286

+0

감사합니다. – 9903286