samedi 25 juillet 2015

getConstructor throws NoSuchMethodException on Derived class [duplicate]

This question already has an answer here:

I recently have encountered a strange error which I can't get my head around. I'm trying to instantiate derived classes of a base class through reflection, however the getConstructor method can't find the clearly existing constructor. In code:

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {

    abstract class Base {
        protected abstract String doWork(String param);
    }

    final class Derived extends Base {
        private String pattern;
        public Derived(String pattern) {
            this.pattern = pattern;
        }
        @Override
        public String doWork(String param) {
            return param.matches(pattern) ? param.toUpperCase() : param.toLowerCase();
        }
    }

    public static void main(String... args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        Constructor<? extends Base> ctor = Derived.class.getConstructor(String.class);
        Base b = ctor.newInstance(".*");
        System.out.println(b.doWork("Hello World!"));

    }

}

Clearly shows my intention, I'd love to see "HELLO WORLD!" as an output however when I execute the application all I can see is:

Exception in thread "main" java.lang.NoSuchMethodException: com.test.Test$Derived.<init>(java.lang.String)
    at java.lang.Class.getConstructor0(Class.java:3074)
    at java.lang.Class.getConstructor(Class.java:1817)
    at com.test.Test.main(Test.java:25)

Now, it's clear that it picks up the Derived.class which clearly has an method with java.lang.String parameter however the exception still rises and tries to tell me there's no such thing.

Edit:

I should have known that someone will mark the question as duplicate without even looking at it in details. So just for you Mr. Sotirios Delimanolis, I know. Yeah, believe me, I know that you can pass the enclosing type as the first parameter to the constructor. Allow me to ask you something: Di you try it? Because I did. Do you think it works? No. Do you know why? Well I don't. So let's put things simple. If I move the Base and Derived classes outside of class Test, the upper program runs and gives the perfect output. I move them in, and not even your precious search works. Please first read the actual question and then mark it...





Aucun commentaire:

Enregistrer un commentaire