ClassLoader

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Hallo,

ich lese gerade das Buch "Java ist auch eine Insel" und wollte folgende Klasse ausprobieren aber leider habe ich keine Ahnung von ClassLoaders.
Class c = Class.forName("LightedPushButton.build.classes"); -> welchen Pfad muss ich hier angeben, irgendeinen auf meinem Computer oder einen Pfad in einem bestimmten Verzeichnis oder iwe geht das?

herzlichen Dank für Antworten!!

lg
Michl


Code:
import java.net.*;

public class FindClassLocation {
	static String findLocation(Class clazz)
	{
		ClassLoader loader = clazz.getClassLoader();
	
		if (loader == null)
			return null;
	
		URL url = loader.getResource(clazz.getName().replace('.', '/') + ".class");
	
		return (url != null) ? url.toString() : null;			
	}
	
	public static void main (String[] args) throws Exception
	{
		Class c = Class.forName("LightedPushButton.build.classes");
	
		System.out.println("Class: " + c.getName());
		System.out.println("Filename: " + findLocation(c));
	}


}
 

MQue

Top Contributor
und wo kann di eKlasse sein, in dem Ordner, wo ich mein aktuelle Projekt habe oder irgendwo?

lg und vielen Dank
 

MQue

Top Contributor
was heißt im ClassPath? Den Pfad, den ich in der Umgebungsvariable eingegeben habe
 

Murray

Top Contributor
Ja, es sei denn, du hättest die VM mit der "-cp"-Option gestartet; in dem Fall überschreibt der da angegebene Pfad die Umgebungsvariable. Und wenn du die VM mit -"jar" gestartet hast, muss sich die Klasse in diesem Jar-File befinden; auch in diesem Fall wird der Classpath nicht gezogen.

Und noch eine Ausnahme: Klassen aus der JRE werden in jedem Fall gefunden, egal wie der explizite Classpath gesetzt ist.
 

MQue

Top Contributor
ich verstehs nicht, ich bekomme immer diese Exception:
was mache ich da falsch?

Code:
Exception in thread "main" java.lang.ClassNotFoundException: LightedPushButton
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at FindClassLocation.main(FindClassLocation.java:20)
 

Murray

Top Contributor
Was ist den LightedPushButton für eine Klasse? Deine eigene? Hat die ein Package? Lieg das Class-File dort, wo auch FindClassLocation.class liegt? Wie rufst du FindClassLocation auf?
 
G

Gast

Gast
Aber wie kann ich dem ClassLoader einen Pfad mitgeben, wenn er angenommen alle Klassen in jar Files unter D:\jars laden soll???
 
G

Guest

Gast
Hallo ich habe ein ähnliches Problem.
Ich habe zum Bespiel diese Klasse, welche unter C:\ liegt:
Code:
public class NeuZuLadeneKlasse
{
  static
  {
    System.out.println( "NeuZuLadeneKlasse gefunden" );
  }
  
  public static void ausgabe()
  {
	  System.out.println("static Methode ausgabe wurde aufgerufen");
  }
  
  public void ausgabe2()
  {
	  System.out.println("Methode ausgabe2 wurde aufgerufen");
  }
  
}

Und diese Klasse zum Laden:
Code:
import java.io.File;
import java.net.*;

public class KlassenNeuladen
{
  static Object neuesExemplar( String pfad, String klassename ) throws Exception
  {
    URL url = new File( pfad ).toURL();

    URLClassLoader cl = new URLClassLoader( new URL[]{ url } );

    Class c = cl.loadClass( klassename );

    return c.newInstance();
  }

  public static void main( String args[] ) throws Exception
  {
    Object neu = neuesExemplar( "c:/", "NeuZuLadeneKlasse" );
    //neu.ausgabe();
  }
}

Das funktioniert auch.
Nun stellt sich mir die Frage, wie ich zum Beispiel ein Object dieser Klasse erstellen kann und Methoden ausführen kann?
Zusätzlich würde ich gerne wissen wie ich diese Klasse laden kann wenn sie in einem jar File liegt, sagen wir z.B. in c:\tmp.jar in dem package testA.testB.NeuZuLadendeKlasse ??
 
G

Gast

Gast
Das kann doch nit sein das keiner, aber wirklich keiner weis wie man z.B. einen ClassLoader überscreiben kann, also somit jede Klasse in einem jar file von diesen geladen/erneut geladen wird.
 

Wildcard

Top Contributor
Einen eigenen Classloader kannst du genau dann einsetzen wenn keiner der Standard Classloader deine Klasse findet.
Dein konkretes Problem ist nun welches?
 
G

Gast

Gast
Ich habe eine Klasse, welche sich an einem bestimmten Ort im FileSystem in einem jar File befindet, die ich ladet möchte.
 
G

Guest

Gast
Also es sieht bei mir zur Zeit so aus:
Code:
public static void main( String args[] ) throws Exception
  {    
	  Class clazz = new URLClassLoader(new URL[] { new File("c:/").toURL()}).loadClass("NeuZuLadeneKlasse");
	  System.out.println(clazz.getName());
	  Method[] method = clazz.getMethods();
	  
	  Method methodTestAusgabe = clazz.getMethod( "ausgabe", new Class[0]); 
	  Object o = clazz.newInstance(); 
	  methodTestAusgabe.invoke( o, new Object[0]); 
	  
	  for(int i=0; i<method.length; i++)
	  {
		  System.out.println(method[i].getName());
	  }
  }

Das heist, das ich die Klasse "NeuZuLadendeKlasse" von C:\ laden möchte und davon ein Object erzeugen
will, damit ich diese in meinen weiteren Projekt ganz normal nutzen kann.

Und das jede weitere Object von dieser Klasse wieder ganz normal mittels des Namen der Klasse erstellt werden kann.
Code:
NeuZuLadendeKlasse neu = new NeuZuLadendeKlasse();
neu....

So sollte das laufen.
 

Murray

Top Contributor
Das sollte der URLClassLoader doch können, wenn man der Dokumentation Glauben schenken kann (meistens kann man das).
javadoc hat gesagt.:
This class loader is used to load classes and resources from a search path of URLs referring to both JAR files and directories. Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be opened as needed.
 
G

Guest

Gast
Code:
Class NeuZuLadendeKlasse = new URLClassLoader(new URL[] { new File("c:/").toURL()}).loadClass("NeuZuLadeneKlasse");
	  NeuZuLadendeKlasse test = new NeuZuLadendeKlasse();

Ich wollte das das irgendwie so in etwa funktioniert, aber das tut es nicht.

Brauche Hilfe.
 
Bau dir doch einfach ein Interface, dass die zu ladende Klasse implementieren muss. Dann kannst du es wie folgt machen (wichtig sind zeilen 14 und 15 von ClTest.java):

ClassToLoad.java
Code:
package org.sofarockers.addon;

import org.sofarockers.Bar;

public class ClassToLoad implements Bar {
	
	static {
		System.out.println("Hallo Welt! Ich wurde geladen!");
	}
	
	public static void printFoo() {
		System.out.println("Foo!");
	}
	
	public void printBar() {
		System.out.println("Bar!");
	}
}

Bar.java
Code:
package org.sofarockers;

public interface Bar {
	
	public void printBar();
}

ClTest.java
Code:
package org.sofarockers;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class ClTest {

	public static void main(String[] args) {
		try {
			URL url = new File("/Users/stefan/workspace/Test/org/sofarockers/addon/").toURI().toURL();
			URLClassLoader cl = new URLClassLoader(new URL[]{url});
			Class<?> c = cl.loadClass("org.sofarockers.addon.ClassToLoad");
			Bar o = (Bar) c.newInstance();
			o.printBar();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
D Classloader ohne Package Allgemeine Java-Themen 10
N Klasse via ClassLoader laden Allgemeine Java-Themen 2
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
K [Refactoring] ClassLoader Verzeichnis durchsuchen lassen Allgemeine Java-Themen 7
schlingel Webstart/Applet Problem - Classloader-Bug Allgemeine Java-Themen 7
M Security Manager für bestimmte Klassen/Classloader? Allgemeine Java-Themen 3
hdi ClassLoader / Constructor Call intern Allgemeine Java-Themen 11
C inteface not visible from classloader Allgemeine Java-Themen 2
M jdbc treiber (h2) mit eigenem ClassLoader laden Allgemeine Java-Themen 4
B Eigener ClassLoader Allgemeine Java-Themen 9
MQue ClassLoader Pfad ausgeben Allgemeine Java-Themen 6
S Problem mit ClassLoader.getSystemResource !! Allgemeine Java-Themen 3
V Image laden - URL über ClassLoader ermitteln Allgemeine Java-Themen 2
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
E Wieder mal der Classloader Allgemeine Java-Themen 6
F ClassLoader und "Cache" Allgemeine Java-Themen 2
MQue ClassLoader Allgemeine Java-Themen 5
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
P System.getProperty zu Classloader Allgemeine Java-Themen 21
G Classloader Problem Allgemeine Java-Themen 10
M Bibliotheksname zur Laufzeit ermitteln (Classloader) Allgemeine Java-Themen 7
G Problem mit URL classloader Allgemeine Java-Themen 10
S classloader + jar + resourcen in dem jar Allgemeine Java-Themen 4
F mit classloader klassen ausserhalb *.jar einlesen Allgemeine Java-Themen 4
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
T ClassLoader und Zugriff auf unbekannte Klassen Allgemeine Java-Themen 5
C ClassLoader - dymisches Laden von JDBC Drivers Allgemeine Java-Themen 3
R Problem mit Classloader Allgemeine Java-Themen 2
D Programm mit eigenem ClassLoader funktioniert nicht Allgemeine Java-Themen 12
K Problem mit ClassLoader - Laden von Resourcen aus Jar's Allgemeine Java-Themen 14
C Problem mit ClassLoader Allgemeine Java-Themen 2
T Brauche Hilfe bei ClassLoader Allgemeine Java-Themen 2
G cachender ClassLoader u.v.m. Allgemeine Java-Themen 5
G ClassLoader Allgemeine Java-Themen 3
R ClassLoader funktioniert in Verbindung mit JAR-Datei nicht Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben