2015-03-22 3 views
3

Я новичок в JAVA , и я пытаюсь узнать reflection. Я хочу получить конкретный конструктор (собирание примера формы here) из моего класса:JAVA getConstructor throws NoSuchMethodException

public class Example1 { 
    public Example1() { 
    } 

    public Example1(int i) { 
    } 

    public Example1(String s) { 
     System.out.println("using param = " + s); 
    } 

    public static void main(String[] args) throws Exception { 
     Class<?>[] paramTypes = String.class.getClasses(); 
     Constructor<Example1> ctor = Example1.class.getConstructor(paramTypes); 
     ctor.newInstance("test"); 
    } 
} 

Я получаю NoSuchMethodException при попытке создать экземпляр ctor

Что я здесь отсутствует?

+2

Ваш код на самом деле не вызывает никаких исключений. Он также не компилируется, поскольку вы не проверяете исключения NoSuchMethodException и SecurityException в main(). – tzima

+0

@ TomášZíma Я не могу сказать, что он не компилирует на моей станции , , кстати, почему «-1»? – LordTitiKaka

+0

он не компилируется из-за причины, о которой я вам говорил, - есть исключения, для которых вам нужно проверить. Пример ответа, который я написал, должен работать на вашей станции, не так ли?BTW, я не уменьшил ваш вопрос ... – tzima

ответ

3

Рабочий пример:

import java.lang.reflect.Constructor; 

public class Test { 
    public Test(String str) { 
     System.out.println(str); 
    } 

    public Test(int a, int b) { 
     System.out.println("Sum is " + (a + b)); 
    } 

    public static void main(String[] args) throws Exception { 
     Constructor<Test> constructorStr = Test.class.getConstructor(String.class); 
     constructorStr.newInstance("Hello, world!"); 

     Constructor<Test> constructorInts = Test.class.getConstructor(int.class, int.class); 
     constructorInts.newInstance(2, 3); 
    } 
} 

Обратите внимание, что метод getConstructor фактически не принимает массив. Он определен как:

public Constructor<T> getConstructor(Class<?>... parameterTypes) { 

... что означает, что он принимает переменное количество аргументов, которые должны были быть переданы так же, как и я. Передача массива также возможна, но это необязательно.

То, что вы сделали первоначально было эквивалентно:

Constructor<Test> constructor = Test.class.getConstructor(String.class.getClasses()); 
    constructor.newInstance("Hello"); 

Но что делает String.class.getClasses() возвращение? Хороший вопрос! Пройдемся отладки:

Class<?>[] classes = String.class.getClasses(); 
    System.out.println(classes.length); // prints 0 

Там в документации о getClasses(): https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClasses. Проверьте это, и вы узнаете, почему это так.

Ради полноты. Супер-оригинально вопрос (до редактирования) содержит еще один конструктор - непараметрический одно:

import java.lang.reflect.Constructor; 

public class Example1 { 
    public Example1() { 
    } 

    public Example1(String s) { 
     System.out.println("using param = " + s); 
    } 

    public static void main(String[] args) throws Exception { 
     Constructor<Example1> ctor = Example1.class.getConstructor(String.class.getClasses()); 
     ctor.newInstance("test"); 
    } 
} 

проблема, которая возникает здесь IllegalArgumentException бросают. Это потому, что хотя String.class.getClasses() возвращает пустой массив, на самом деле есть конструктор, который соответствует критериям - непараметрический конструктор! У него нет аргументов, и массив, возвращаемый String.class.getClasses(), тоже не содержит ничего. Это означает, что конструктор успешно найден, но при попытке создать экземпляр с помощью ctor.newInstance("test") он терпит неудачу, потому что найденный конструктор не принимает любые аргументы.

+0

wow thanks !! отличный ответ :) – LordTitiKaka

+0

Это происходило со мной, потому что я удалил «общедоступный» из общедоступного MainCameraRollXML (контекст контекста) –

-1

Попробуйте его с помощью

Constructor<example1> ctor = examTesting.getConstructor(new Class[]{String.class}); 

Это возвращает конструктор с одним параметром типа String. Ваш метод может возвращать несколько значений и, следовательно, конструктор с несколькими параметрами будет искать, но не найден -> NoSuchMethodException выбрано.

Более подробную информацию о getClasses(): http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29

Смежные вопросы