Hallo, ich bekomme folgende Fehlermeldung(siehe unten) bei dem Versuch eine Klasse zu instanziieren und würde mich über Tipps freuen, wieso das so nicht funktioniert
Fehlermeldung:
java.lang.IllegalAccessException: Can not call newInstance() on the Class for java.lang.Class
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at webServlet.isClassRegistered(webServlet.java:184)
at webServlet.perform(webServlet.java:83)
at webServlet.doPost(webServlet.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
@WebServlet("/webServlet")
public class webServlet extends HttpServlet
{
public static Hashtable<String, Class> hashTableWithClasses = new Hashtable<String, Class>();
@Override
public void init() throws ServletException
{
super.init();
hashTableWithClasses.put("Suche", Suche.class);
}
public Class isClassRegistered(String httpParameter)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException
{
Class klasse = null;
for (String s : hashTableWithClasses.keySet())
{
if (s.equals(httpParameter))
{
//Ausgabe Klassenname "Suche"
System.out.println(s + " s");
//Ausgabe Klassenname "Suche"
System.out.println(httpParameter + " httpParameter");
klasse = hashTableWithClasses.get(s).getClass();
//hier stürzt das Programm ab
klasse.newInstance();
System.out.println("Klassenname -------------" + klasse.getName());
break;
}
}
return klasse;
}
}
Da Du schon die Class-Objekte in der HashTable hast, ist das getClass() in Zeile 30 ein Fehler. Lösche das.
Und in Deinem anderen Thread hatte ich schon geschrieben, dass Deine Idee mit newInstance schlecht ist. Speicher Dir in der HashTable zu den gegebenen Strings lieber einen Algorithmus (eine Art Factory), wie Instanzen dieser Klasse zu erzeugen sind. Und hole Dir darüber Deine Instanzen.
Okay danke für den Tipp, es hat funktioniert nachdem ich getClass() gelöscht habe.
Das mit Factory Algorithmus finde ich zu umständlich, mit new Instanze funktioniert es doch auch ganz gut
Wenn ich Frage in zwei verschiedenen Foren stelle, und eine beantwortet wird, versuche ich die andere gleich als erledigt zu markieren.
Das Problme mit einem Forum ist das, dass man manchmal da keine Antwort bekommt und in zwei Foren steigt die Wahrscheinlichkeit aber gut ich versuche meine Fragen auf einen Forum zu begrenzen.
@Cross-Posts
allgemein in dieser Reihenfolge aufgrund der Situation im anderen Forum durchaus zu akzeptieren
von einem länger aktiven User in beiden Foren natürlich nicht so schön, korrekt
edit:
[QUOTE=JavaFan]Wenn ich Frage in zwei verschiedenen Foren stelle, und eine beantwortet wird, versuche ich die andere gleich als erledigt zu markieren.
[/QUOTE]
das kannst du aber nicht garantieren, offener ist, gleich bei beiden auf die jeweils anderen Threads zu verlinken,
was vom anderen Forum nach hier freilich schwer sein dürfte
throws InstantiationException, IllegalAccessException,
ClassNotFoundException
{
Class klasse = null;
for (String s : hashTableWithClasses.keySet())
{
if (s.equals(httpParameter))
{
//Ausgabe Klassenname "Suche"
System.out.println(s + " s");
//Ausgabe Klassenname "Suche"
System.out.println(httpParameter + " httpParameter");
klasse = hashTableWithClasses.get(s).getClass();
//hier stürzt das Programm ab
klasse.newInstance();
System.out.println("Klassenname -------------" + klasse.getName());
break;
}
}
return klasse;
}
}```
auch als
``` public Class isClassRegistered(String httpParameter)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException
{
for (String s : hashTableWithClasses.keySet())
{
if (s.equals(httpParameter))
{
//Ausgabe Klassenname "Suche"
System.out.println(s + " s");
//Ausgabe Klassenname "Suche"
System.out.println(httpParameter + " httpParameter");
Class klasse = hashTableWithClasses.get(s);
//hier stürzt das Programm ab
System.out.println("Klassenname -------------" + klasse.getName());
return klasse.newInstance();
}
}
return null;
}
}```
schreiben, dann sparst du dir das break und es wird leichter erkennbar, dass die Methode null zurückliefern kann.
Gruß
Ja okay das sieht gut aus, danke auch für den Tpp Firephoenix!
Ich bekomme jetzt eine andere Fehlermeldung, da ich aus dieser Klasse die ich instanziiert habe eine Methode mit einem Parameter aufrufen möchte. Woran kann das liegen?
Fehlermeldung
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
.........
........
Die Variable instance enthält eine Referenz auf ein java.lang.Class-Objekt (und ist daher unglücklich benannt). Bei Method.invoke muss aber als erstes Argument eine echte Instanz der Klasse übergeben werden (und eben kein Class-Objekt). Je nach Klasse funktioniert möglichweise.
instance ist ein Class-Objekt, das ist als Parameter unsinnig,
wenn du an dem (wahrscheinlichen) Table-Objekt recivedTable die onCall-Methode aufrufen willst, dann muss recivedTable der erste Parameter sein,
dahinter kommen noch Objekte die tatsächliche Parameter der Methode sein sollen
wäre leichter zu beantworten wenn du auch die Definition der Methode usw. verrätst,
falls unnötig komplexer Code, dann an einfachen Dummy-Klassen üben