Besonderes NoClassDefFoundError:

Kann ich verstehen,
aber ich hab nunmal eine .class die in keinem package liegt.
wen ich sie jetzt zwangsweise in ein package verfrachte dann kommt der NoClassDefFoundError

gibt es eine lösung dafür

Außer jetzt alle class dateien in das das "default package" zu legen?
 
Entweder schreibst du einen Wrapper, was den Nachteil hat, dass es kein echter Wrapper wäre, weil du die eigentliche Klasse nicht erweitern könntest.

Das würde dann in etwa so aussehen:

Die Klasse im Default package:
Java:
public class DefaultPackageClass {

	public void test() {
		System.out.println(this.getClass().getName() + ": test");
	}

	public void testParams(String param1, String param2) {
		System.out.println(this.getClass().getName() + ": " + param1 + " "
				+ param2);
	}

}

Der Wrapper um die Klasse:
Java:
package de.tutorials;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DefaultPackageWrapper {

	private Object instance;

	public DefaultPackageWrapper() {
		try {
			Class forName = Class.forName("DefaultPackageClass");
			instance = forName.newInstance();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void test() {
		callMethod("test");
	}

	public void testParams(String param1, String param2) {
		callMethod("testParams", param1, param2);
	}

	private void callMethod(String name, Object... args) {
		Class[] clazzes = new Class[args.length];
		for (int i = 0; i < args.length; i++) {
			clazzes[i] = args[i].getClass();
		}

		try {
			Method method = instance.getClass().getMethod(name, clazzes);
			method.invoke(instance, args);
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Testen des Wrappers:
Java:
package de.tutorials;

public class Test {

	public static void main(String[] args) throws Exception {
		DefaultPackageWrapper wrapper = new DefaultPackageWrapper();
		wrapper.test();
		wrapper.testParams("Hallo", "Welt");
	}

}

Ergibt:
Code:
DefaultPackageClass: test
DefaultPackageClass: Hallo Welt

Oder du benutzt AspectJ um die Klasse nachträglich ein Interface erweitern zu lassen. Diesem Interface gibst du auch alle Methoden die deine Klasse hat und kannst dann die Klasse über Reflection instanziieren (wie oben) und dann auf das Interface casten. Das ist mehr oder weniger ein bißchen schöner. Einfach wäre es allerdings wohl die Original-Sourcen zu holen und mit package neu zu kompilieren.
 
Hi,

Vielen Dank!

"name, Object... args){"
nachdem ich heruasgefunden habe das die 3 Punkte erst ab version 5 sinn machen funktioniert es wunderbar.

Werde aber wohl noch nen paar Stunden brauchen um das Inhaltlich zu verstehen.
DANKE!
 
Zurück