Java - java.lang.NoSuchMethodException
Ich versuche es mal mit diesem code (Update m_set verwendet wird, im inneren for-Schleife, die durchläuft verschiedene Methoden mit unterschiedlichen Argumenttypen. Wenn ich hinzufügen würde, zum Beispiel int.class in getMethod
würde ich bekomme Fehler nach einer iteration, da die next-Methode erfordern würde String.class. Ist es möglich, solche problem zu lösen mit der spiegelung?):
Method m_set = product.getClass().getMethod(method_name);
m_set.invoke(product, method_value);
Bekomme ich diesen Fehler:
Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.setHeight()
at java.lang.Class.getMethod(Class.java:1655)
at test.ProductTrader.create(ProductTrader.java:68)
at test.Test.main(Test.java:32)
Fehler zeigt es, dass es versucht zu finden, die Methode in der Klasse, dass ich diese Methode verwenden. Aber die Methode in der parent-Klasse, und es ist eine öffentliche Methode. Ich weiß, wenn ich verwenden würde getDeclaredMethod
, es würde einen ähnlichen Fehler, aber warum gibt es diesen Fehler mit getMethod
?
Meiner Klasse jener hat diese Methode:
public abstract class AbstractChair {
public String name;
public int height;
public AbstractChair() {
}
public AbstractChair(String name, int height){
this.name = name;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
Meiner Klasse, dass ich versuche, diese Methode auf:
public class NormalChair extends AbstractChair {
public NormalChair() {
super();
}
public NormalChair(String name, int height) {
super(name, height);
}
//Copy constructor
public NormalChair(NormalChair chair) {
this(chair.getName(), chair.getHeight());
}
}
Update2
Wenn ich etwas wie das hier tun:
if(method_name == "setHeight"){
Method m_set = product.getClass().getMethod(method_name, int.class);
m_set.invoke(product, method_value);
}
else if (method_name == "setName")
{
Method m_set = product.getClass().getMethod(method_name, String.class);
m_set.invoke(product, method_value);
}
Dann der Fehler verschwindet. Kann jemand empfehlen universeller Ansatz?
Nicht vergleichen Sie Strings mit
==
. Stattdessen equals
wie stringOne.equals(stringTwo)
. Mehr info hierInformationsquelleAutor Andrius | 2013-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, dass Sie vergaß zu übergeben, Art der Argumente, die die Methode braucht (denken Sie daran, dass Methoden überladen werden kann mit verschiedenen Argumenten-Typen). Werfen Sie einen Blick auf Ihren code, es gibt keine
setHeight()
Methode gibt es abersetHeight(int)
. Sie sollten versuchen, so etwas wieDa könnten Sie Probleme haben, mit primitiven Typen, die Sie verwenden können, herum. Unter der Annahme, dass es nur eine Methode mit demselben Namen in Ihrer Klasse, die Sie möchten finden, können Sie iterieren über alle öffentlichen Methoden, vergleichen Sie den Namen mit der Methode, die Sie suchen, und dann rufen Sie es mit Argumenten, die Sie wollen. So etwas wie
Andere und wahrscheinlich bessere Möglichkeit wäre die Verwendung von Klassen aus
java.bean
Paket wiePropertyDescriptor
. Dank dieser Klasse finden Sie Getter und setter für spezifische Eigenschaft. Beachten Sie, dass die Eigenschaft fürsetHeight
istheight
so würden Sie brauchen, um verwenden Sie es wieargument type mismatch
Fehler, weil ich mit for-Schleife, die verwendet verschiedene Methoden, um Werte über das Objekt (und die Methoden haben verschiedene Arten)Nein das kannst du nicht, das würde dazu führen, dass potentiell Probleme, wenn es waren wenige Methoden, die passen würden, einen Teil der Arten. Sie müssen spezifisch sein, was die argument-Typen hat die Methode, die Sie interessiert sind in. Aber es scheint, dass Ihre Klasse nicht überladen von Methoden es gibt also nur eine mit dem gleichen Namen in der Klasse. Wenn das wahr ist, dann können Sie einfach alle Methoden mit
getMethods()
und Durchlaufen Sie diese und erhalten Sie eine Hexe hatgetName().equals(method_name)
und dannmethod.invoke(product,method_value)
Werfen Sie einen Blick auf meine aktualisierte Antwort. Sie werden wahrscheinlich finden Sie einige interessante Dinge dort.
Würde es dann nicht geben Sie mir Fehler nach einer
for
iteration, wenn java beginnt die Suche nach einer MethodesetName
?Was meinst du? Unter der Annahme, dass es nur eine Methode
setName
in Ihrer Klassefor
Schleife, wird es finden, führen Sie diese mit Ihren Daten, die Sie passieren ininvoke
- und stop-looping für andere Methoden (denn es werden nicht alle, die genannt werdensetName
nach bisherigen Annahme).InformationsquelleAutor Pshemo
Verwenden
product.getClass().getMethod("setHeight", int.class);
. Sie übergeben der Methode, die Parameter-Typen Ziel für die Signatur der Methode.Sicher, verwenden Sie
method_value.getClass()
. Ich bin mir nicht sicher, ob das funktionieren wird, wenn die Art dermethod_value
ist eine Unterklasse der tatsächliche Typ in der Erklärung. (Update: Nein, es wird nicht: ideone.com/5sWYV4)Mit -
method_value.getClass().getTypeParameters()
innengetMethod
gibt Fehler:The method getMethod(String, Class<?>...) in the type Class<capture#4-of ? extends Object> is not applicable for the arguments (String, TypeVariable<Class<capture#5-of ? extends Object>>[])
ist für die Arbeit mit Generika. Ich glaube nicht, dass es ist, was Sie hier suchen.
InformationsquelleAutor sp00m