2016-06-20 3 views
1
public class MyClassLoader extends URLClassLoader { 

    public MyClassLoader() throws Exception{ 
     super(new URL[]{new URL("file:///home/ubuntu/java/hello.jar")}); 
    } 

    @Override 
    public Class loadClass(String name) throws ClassNotFoundException { 
     if (name.equals("hello.example.org.Foo") || name.equals("hello.example.org.Bar")) 
     { 
      System.out.println("Foo or Bar is loaded"); 
     } 
     return super.loadClass(name); 

    } 

}Wie schreibe ich einen URLClassLoader in Java, so dass er vor dem Laden bestimmter Klassen einen Codeblock ausführen kann?

Ich möchte nur einen Block von Code auszuführen, bevor bestimmte Klassen und den obigen Code zu laden funktioniert nicht ganz, und ich bin nicht sicher, wo der Fehler?

, wenn ich alle meine Klassen in JAR-Datei haben würde ich es laufen als

java -Djava.system.class.loader=MyClassLoader -jar hello.jar 
+0

sollten Sie Code hinzufügen, der zeigt, wie Sie 'MyClassLoader' verwenden – wero

+0

getan! Ich habe gerade meine Frage bearbeitet. – user1870400

Antwort

0

folgt Sie findClass(String) statt loadClass außer Kraft setzen sollte.

+0

Nun, ich bin mir nicht ganz sicher, wie das funktioniert. Zum Beispiel werden meine Java-Klassen in einer JAR-Datei einige Standard-Java-Klassen verwenden, aber ich würde lieber versuchen, auf das Laden dieser Standard-Java-Klassen zu verzichten, es sei denn, ich muss ... .URLCLassLoader erweitert ClassLoader – user1870400

0

Wenn Sie die Systemklasse-Loader über -Djava.system.class.loader=MyClassLoader Sie einen Konstruktor mit einem Parameter Classloader zur Verfügung stellen müssen:

public MyClassLoader(ClassLoader parent) throws Exception{ 
    super(new URL[]{new URL("file:///home/ubuntu/java/hello.jar")}, parent); 
} 

Sie sollten eine java.lang.NoSuchMethodException gesehen, wenn Sie ohne einen solchen Konstruktor ausgeführt werden.

+0

Sie haben absolut Recht! Aber wenn ich das tue, lädt der Eltern-ClassLoader alle meine Java-Klassen, so dass ich vor dem Laden bestimmter Klassen keinen Blockcode ausführen konnte, was mein ultimatives Ziel gemäß der Frage ist. Ich bin gerne bereit, bei Bedarf weitere Informationen zur Verfügung zu stellen. – user1870400

Verwandte Themen