getConstructor() wirft NoSuchMethodException .

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hi,

ich habe folgende Situation:

Code:
interface IFactory { }
Code:
class Factory implements IFactory { }
Code:
class C {

    public C(IFactory a) {
    }

}

Klasse Factory möchte nun Instanzen von C erzeugen. Um den Konstruktor zu suchen, nutze ich folgenden Code:

Code:
C.class.getConstructor(Factory.class);

Leider wirft das eine NoSuchMethodException, obwohl doch Factory doch ein IFactory ist. Ich verstehe das nicht so recht. Könnt ihr helfen?

mpG
Tobias
 

Marco13

Top Contributor
Versuch' mal http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getDeclaredConstructor(java.lang.Class...)
 

Marco13

Top Contributor
Oha, da war ich etwas vorschnell, sorry. :oops:

Offenbar braucht man genau den richtigen Typ. Man kann das gewünschte Verhalten aber durch eine Utility-Funktion nachbauen, die sich alle Konstruktoren holt, und bei allen die Parametertype checkt, ob der gewünschte Parameter den gegeben Typen zuweisbar ist...
Code:
import java.lang.reflect.*;

interface IFactory { }

class Factory implements IFactory { }
class Factory2 {}

class C
{
    public C(IFactory a)
    {
    }

}

class ReflectionConstructorTest
{
    public static void main(String args[])
    {
        try
        {
            Constructor a = getConstructor(C.class, Factory.class);
            //Constructor a = getConstructor(C.class, Factory2.class);

            System.out.println(a);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static <T> Constructor<T> getConstructor(Class<T> c, Class... desiredParameterTypes)
        throws NoSuchMethodException
    {
        Constructor constructors[] = c.getConstructors();
        for (int i=0; i<constructors.length; i++)
        {
            Class<?> parameterTypes[] = constructors[i].getParameterTypes();
            boolean isCompatible = false;
            if (parameterTypes.length == desiredParameterTypes.length)
            {
                isCompatible = true;
                for (int j=0; j<desiredParameterTypes.length; j++)
                {
                    Class<?> type = parameterTypes[i];
                    Class<?> desiredType = desiredParameterTypes[i];
                    if (!type.isAssignableFrom(desiredType))
                    {
                        isCompatible = false;
                        break;
                    }
                }
            }
            if (isCompatible)
            {
                //System.out.println("Matching: "+constructors[i]);
                return constructors[i];
            }
        }
        throw new NoSuchMethodException("No matching constructor found");
    }


}

Ist nur kurz getetest, schau auf jeden fall nochmal drüber, ob das auch passt und in allen anderen Fällen funktioniert.

Eigentlich müßte man auch noch sicherstellen, dass immer der spezifischte Typ genommen wird - an eine Methode
void foo(Object x)
können natürlich Objekte ALLER Klassen übergeben werden. Wenn es aber eine Methode
void foo(C c)
gibt, dann muss bei einem Aufruf wie
foo(someC);
auch die foo(C) aufgerufen werden, und nicht foo(Object).
 

Tobias

Top Contributor
Mh, schade, dass getConstructor() das nicht schon von sich macht. Aber danke für die hübsche Funktion, darauf kann ich aufbauen ;)!

mpG
Tobias
 

quippy

Bekanntes Mitglied
Tobias hat gesagt.:
Klasse Factory möchte nun Instanzen von C erzeugen. Um den Konstruktor zu suchen, nutze ich folgenden Code:

Warum suchst Du den Konstruktor nicht wie üblich mit den Parametertypen?!

Code:
	public static Object instanciate(Class theClass, Class[] paramTypes, Object[] param)
	{
		try
		{
			// Instanzierung via Constructor
			java.lang.reflect.Constructor constructor = theClass.getConstructor(paramTypes);
			return constructor.newInstance(param);
		}
		catch (InvocationTargetException ite)
		{
			throw new ClassMapperTargetException(ite.getMessage(), ite.getTargetException());
		}
		catch (Throwable ex)
		{
			throw new ClassMapperException("instantiation failed: " + ex.getMessage(), ex);
		}
	}

So habe ich mir das mal gebaut...
 
S

SlaterB

Gast
> Warum suchst Du den Konstruktor nicht wie üblich mit den Parametertypen?!


genau das hat Tobias doch 1 Zeile nach der von dir gequoteten gemacht?!
darum gehts doch in dem ganzen Thread?
 

quippy

Bekanntes Mitglied
OKOKOK - das habe ich dann wohl nicht richtig gelesen.

Er hätte C.class.getConstructor(IFactory.class); machen müssen - daher die umfangreiche Methode mit dem "isAssignable" und eigener Iteration.

Jaja.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Wie Constructor mit Parametern benutzen (getConstructor) Allgemeine Java-Themen 2
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
3 MP3-Finder wirft NullPointerException Allgemeine Java-Themen 13
N Methode wirft FatalError Allgemeine Java-Themen 2
J AudioClip wirft IllegalStateException Allgemeine Java-Themen 2
VfL_Freak ServerSocket wirft nicht immer eine BindException Allgemeine Java-Themen 21
M DefaultTableModel wirft beim Serialisieren Exception :-( Allgemeine Java-Themen 7
M Iterator wirft Exception Allgemeine Java-Themen 10
F GregorianCalendar wirft keine Fehler bei z.b. Monat 17 Allgemeine Java-Themen 3
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10
M Konstruktor, der Excpetions wirft Allgemeine Java-Themen 2
G POI wirft RecordFormatException Allgemeine Java-Themen 3
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben