Java-reflectie wanneer een methode een variabele arglist heeft

Ik heb iets in de trant van het volgende:

public class A { 
    public void theMethod(Object arg1) {
       //do some stuff with a single argument
    }
}

public class B {
    public void reflectingMethod(Object arg) {
        Method method = A.class.getMethod("theMethod", Object.class);
        method.invoke(new A(), arg);
    }
}

Hoe pas ik dat aan zodat ik in plaats daarvan het volgende kan doen?

public class A { 
    public void theMethod(Object... args) {
       //do some stuff with a list of arguments
    }
}

public class B {
    public void reflectingMethod(Object... args) {
        Method method = A.class.getMethod("theMethod", /* what goes here ? */);
        method.invoke(new A(), args);
    }
}
5
@Darthenius, nou een lijst is niet echt een varargs :-) trouwens, James, je zou in staat moeten zijn om de methode op te zoeken (met List) door List.class te doen Ik vermoed ...
toegevoegd de auteur aishwarya, de bron
Dat werkte. Ik had het al eerder geprobeerd, maar ik was er niet goed meer uit hoe ik de klasse List kon krijgen, omdat ".class" niet is toegestaan ​​op generieke geneesmiddelen. Het maken van een nieuwe lege arraylist werkt echter (zolang de methodekenschema's ArrayList gebruiken voor de argumenten.
toegevoegd de auteur Ginger McMurray, de bron
Heb je Lijst geprobeerd?
toegevoegd de auteur Rok Strniša, de bron

2 antwoord

A.class.getMethod("theMethod", Object[].class);
5
toegevoegd
Met reflectie is de methode die wordt geretourneerd de methode met de naam en parameters van een overeenkomende methode. In dit geval is de methode naam de Methode en de parameters een objectarray. Als u doorgeeft aanroepen van verschillende subklassen klassen van Object maakt het niet uit.
toegevoegd de auteur Ransom Briggs, de bron
Alle klassen breiden Object uit
toegevoegd de auteur Garrett Hall, de bron
Het is de callee waarnaar je op zoek bent ... niet een bepaalde beller.
toegevoegd de auteur Andy Thomas, de bron
@JamesMcMurray, je kunt eigenlijk varargs gebruiken. Roep gewoon de methode aan die de args in een Object [] b.v. method.invoke (nieuw A (), nieuw Object [] {nieuw Object [] {"a", "b", "c"}}) . Kort gezegd, invoke-methode neemt ook varargs dus kan verwarren waar de array is gericht.
toegevoegd de auteur aishwarya, de bron
De klasse Object []. Veroorzaakt een uitzondering bij het proberen de gereflecteerde methode aan te roepen als ik meer dan één item in de array heb doorgegeven. Een String [] van {"a", "b", "c"} klaagde bijvoorbeeld dat er teveel argumenten waren (hij verwachtte 1 maar kreeg er drie).
toegevoegd de auteur Ginger McMurray, de bron
Ik zal dit naar een antwoord verplaatsen zodra het systeem het toelaat: de suggestie van Darthenius in de opmerkingen voor de oorspronkelijke vraag werkte, zodra ik mijn hoofd eromheen wikkelde. public class A {public void theMethod (ArrayList args) {// do stuff}} public class B {public void reflectingMethod (ArrayList args) {Methode methode; probeer {method = A.class.getMethod ("theMethod", args.getClass ()); methode.invoke (nieuwe A (), args); } catch (Uitzondering e) {}}}
toegevoegd de auteur Ginger McMurray, de bron
En ik accepteer het antwoord binnen 21 uur, als het me dat eenmaal laat. Yeesh! @aishwarya: bedankt! Helaas kan ik van tevoren niet zeker zijn van de grootte van de array, dus het dynamisch opbouwen van het array met [] kan vervelend zijn. Ik blijf bij wat ik al heb, vooral omdat het werkt. : D
toegevoegd de auteur Ginger McMurray, de bron

De suggestie van Darthenius in de opmerkingen voor de oorspronkelijke vraag werkte, zodra ik mijn hoofd eromheen wikkelde.

public class A {
    public void theMethod(ArrayList args) {//do stuff 
    }
}

public class B {
    public void reflectingMethod(ArrayList args) {
        Method method;
        try {
            method = A.class.getMethod("theMethod", args.getClass());
            method.invoke(new A(), args);
        } catch (Exception e) {}
    }
}


0
toegevoegd