ClassLoader Objekt laden das eine abstrakte Klasse implementiert

Hi,

ich versuche Objekte einer Klasse zu Erzeugen. Die Klassen habe ich in Plugins.jar Datei ausgelagert.
Das Erzeugen eines Objektes der Klasse ModelImageChange und ModelNoticeChange funktioniert.
Diese Klassen implementieren jeweils das Interface Manipulator.

Doch beim Erzeugen eines Objektes der Klasse PanelImageChange wird an der Stelle
Object object = clazz.newInstance();
eine java.lang.InstantiationException: com.master.pluginView.PanelNoticeChange$1 Exception
geworfen.

Wenn ich in meine Plugin.jar Datei schaue ist folgender Aufbau zu sehen:

Ich vermute der Fehlen liegt daran, dass zunächst auf PanelNoticeChange$1 zugegriffen wird.
Würde nur auf PanelNoticeChange zugegriffen werden, würde vermutlich das Erzeugen einer Instanz dieser Klasse
funktionieren. Ich weiß nicht genau wieso ich dies PanelNoticeChange$1 überhaupt
in der jar habe. Ich vermute das hat was mit der Abstrakten Klasse zu tun von der geerbt wird und die Abstrakte Klasse
von JPanel erbt.
An den Interfaces wirds wohl nicht liegen da es bei ModelNoticeChange keine Dateien mit einem $ im Namen gibt,
obwohl diese ein Interface implementieren.

Jetzt frage ich mich wie ich eine Überprüfung am besten implementieren könnte um sicherzustellen, dass
ich bei PanelNoticeChange bin und nicht bei PanelNoticeChange$1 o.ä.
Wie geht man hier am elegantest vor?

Ich könnte den Dateinamen auf $ untersuchen aber ist das eine elegante Lösung?
Gibts dafür nicht passendere Lösungen?

	public ModelPlugin() throws FileNotFoundException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
        {
		File pluginsJar = new File("Plugins" + File.separator + "Plugins.jar");
		
		if(pluginsJar.exists())
		{
			URL[] url = {pluginsJar.toURI().toURL()};
			URLClassLoader urlClassLoader = new URLClassLoader(url);
			JarInputStream jarInputStream = new JarInputStream(new FileInputStream(pluginsJar));
			JarEntry jarEntry = jarInputStream.getNextJarEntry();
				
			while(jarEntry != null)
			{
				if(jarEntry.getName().toLowerCase().endsWith(".class"))
				{
					String clazzLocation = jarEntry.getName().substring(0, jarEntry.getName().length()-6).replace('/', '.');
					System.out.println(clazzLocation);
					Class<?> clazz = urlClassLoader.loadClass(clazzLocation);
					Object object = clazz.newInstance();
						  	
					if(object instanceof Manipulator)
					{
						Manipulator manipulator = (Manipulator)object;
						System.out.println(object.getClass().getSimpleName());
					}
					else if(object instanceof PanelView)
					{
						PanelView panelView = (PanelView)object;
						System.out.println(object.getClass().getSimpleName());
					}
				}
					
				jarEntry = jarInputStream.getNextJarEntry();
			}
		}
	}
public abstract class PanelView extends JPanel implements ManipulationDataCreator
{
	public PanelView()
	{
		super();
	}
}
public interface Manipulator 
{
	 public void manipulateData(File file, ManipulationData manipulationData);
}
public class PanelImageChange extends PanelView
{
    ...
    ...
}
public class PanelNoticeChange extends PanelView 
{
    ...
    ...
}
public class ModelImageChange implements Manipulator
{
    ...
    ...
}
public class ModelNoticeChange implements Manipulator
{
   ...
   ...
}

com.master.pluginModel.ModelImageChange
ModelImageChange
com.master.pluginModel.ModelNoticeChange
ModelNoticeChange
com.master.pluginView.PanelNoticeChange$1
java.lang.InstantiationException: com.master.pluginView.PanelNoticeChange$1
at java.lang.Class.newInstance(Unknown Source)
at Model.ModelPlugin.(ModelPlugin.java:56)
at Model.FacadeModel.(FacadeModel.java:24)
at MyMain$1.run(MyMain.java:41)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

die $1 gibt es bei anonymen inneren Klassen, etwa
add(new ActionListener() { … } );

insofern für JPanel recht typisch anzutreffen,


$Zahl zu prüfen wäre leicht möglich auch mein Weg,
oder du kannst auch noch Methoden von Class anschauen, isAnonymousClass(), isLocalClass() usw.,
nur Top Level-Eigene Klassen initialisieren

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html