Announcement

Collapse
No announcement yet.

Dynamisches Nachladen von Class-Files

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamisches Nachladen von Class-Files

    Hallo Ihr Javafreaks ;-)

    Ich hab da ein Problem mit dem dynamischen Nachladen von Class-Files während des Programmlaufs.
    Ich habe eine Klasse geschrieben, die von der abstrakten Klasse java.lang.ClassLoader abgeleitet ist. Diese enthält die abstrakte Methode loadClass, die ich implementiert habe. Der Programmablauf sieht nun wie folgt aus:
    - ein Class-file wird in ein Bytearray eingelesen
    - mit defineClass soll aus dem Bytearray ein Objekt der Klasse Class erzeugt werden
    - mit resolveClass wird die Klasse dem Betriebssystem bekannt gegeben
    - ein Objekt der geladenen Klasse soll erzeugt werden
    Die von mir gewünschte Klasse wird auch gefunden und in das Bytearray eingelesen, aber dann versucht die jvm noch andere Klassen z.B.: java.lang zu laden. Warum dieses? Kann ich nur Klassen nachladen, die von keiner der anderen Javaklassen abgeleitet ist? Sollte das Nachladen in einen eigenen Thread ablaufen?

  • #2
    Hallo,

    das dynam. Laden von Klassen ist abhängig von der Java Version. Unter Java 2 sollte der folgende Quellcode funktionieren (war mit 1.x etwas schwieriger :-) Abhängig von den Imports werden dann vom Original-ClassLoader weitere Klassen geladen.

    <CODE>
    class InternalClassLoader extends ClassLoader
    {

    public Class findClass(String name)
    {
    byte[] b = loadClassData(name);
    return defineClass(name, b, 0, b.length);
    }

    private byte[] loadClassData(String name)
    {
    try
    {
    name = pathToClassRoot + name.replace('.', File.separatorChar) + ".class";

    File f = new File(name);
    FileInputStream fi = new FileInputStream(name);
    byte cByte[] = new byte[(int)f.length()];
    fi.read(cByte);
    fi.close();
    return cByte;
    }
    catch (Exception ex)
    {
    }

    return null;
    }

    private String pathToClassRoot = "<path>";
    }


    ...
    InternalClassLoader cLoader = new InternalClassLoader();
    Class c = cLoader.loadClass("com.signsoft.test.XYZClass");
    ...
    </CODE&gt

    Comment

    Working...
    X