Klasse mit getClass().newInstance instanziieren

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;
     
      }
    }

Gruß

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.

*** Edit ***

Übrigens sind Cross-Posts ([noparse]http://www.java-forum.org/allgemeine-java-themen/154621-klasse-getclass-newinstance-instanziieren.html[/noparse]) sehr unfein. Stelle Die Frage bitte nur in einem Forum. Gründe findet man per google-Suche. Stichpunkte:

  • Unterschiedliche Leute machen sich die Mühe einer Antwort, die Du vielleicht garnicht mehr brauchst, weil schon im anderen Forum beantwortet.
  • Andere, die sich auf für’s Thema interessieren, finden die Antwort im jeweils anderen Forum nicht.
  • Ich habe hier einen Thread angesprochen, der eigentlich im anderen Forum war ==> Verwirrung perfekt!

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 :slight_smile:

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.

Gruß

@Cross-Posts
allgemein in dieser Reihenfolge aufgrund der Situation im anderen Forum durchaus zu akzeptieren :wink:
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 :wink: :wink:

Du kannst übrigens

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)
.........
........

 Class instance = isClassRegistered(request.getHeader("handlerName"));
        Method onCallMethod = instance.getMethod("onCall",Table.class);
        Table table = (Table) onCallMethod.invoke(instance, recivedTable);

Gruß

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.

Table table = (Table) onCallMethod.invoke(instance.newInstance(), recivedTable);

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

wie auch überall zu finden:

Hallo, danke euch für die Antworten, der Tipp mit instance.newInstance() von Murray hat tatsächlich funktioniert :idea:

Gruß