NoSuchMethodException при использовании JAVA Reflection - PullRequest
0 голосов
/ 05 мая 2010

Привет. Я пытаюсь использовать отражение, чтобы вызвать метод и обновить значение установщика этого метода.Но я получаю NoSuchMethodException при вызове этого метода.Я обновил код.Мне очень жаль за ошибки в предыдущем коде.Я рефракторил код.Исключение возникает, когда setMethod класса принимает аргументы примитивного типа.

private static Object performMapping( Class voClass, Class[] clazz, Object voObject, Object data,String fieldType ){
    voClass.getMethod( "set" + fieldType, clazz ).invoke( voObject, data );
    return voObject;
}
private static Object mapField(ResultSet rs){
    Class voClass=Class.forName( "com.test.Test" );
    Object voObject = voClass.newInstance();
    Class[] doubleArrayParamTypes = new Class[ 1 ];
    doubleArrayParamTypes[ 0 ] = Double.class;
    voObject = performMapping( voClass, doubleArrayParamTypes, voObject, rs.getDouble(fieldType.getColumn()), "Mark" );
}
/* This is my Class. I need to set the Mark. But it is primitive double. Is it possible to set the mark using the above code? */
public class Test{
        private double mark;
        public double getMark() {
            return mark;
        }
        public void setMark(double mark) {
            this.mark = mark;

Ответы [ 3 ]

1 голос
/ 05 мая 2010

Я вижу, что вы передаете setAddress1 и объединяете его с set, таким образом получая setsetAddress1 Либо передайте имя свойства и введите его с большой буквы, либо удалите set из конкатенации.

Кроме того, предоставленный вами код не будет компилироваться. Вы не можете иметь переменную с именем class

0 голосов
/ 05 мая 2010

Код ниже работает. У вас было две ошибки (за исключением синтаксической ошибки имени класса):

package com.test;

import java.io.IOException;
import java.lang.reflect.*;
import java.util.Arrays;

public class Test {

    Test() throws ClassNotFoundException, InstantiationException,
            IllegalAccessException, IllegalArgumentException,
            SecurityException, InvocationTargetException, NoSuchMethodException {

    }

    private void m() throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException, InstantiationException {

        Class[] doubleArrayParamTypes = new Class[1];
        doubleArrayParamTypes[0] = Double.class;
        Class clazz = Class.forName("com.test.Test");
        Object voObject = clazz.newInstance();
        Double data = 5.0;

        performMapping(clazz, "Address1", doubleArrayParamTypes, voObject, data);

    }

    public static void main(String... args) throws IOException,
            ClassNotFoundException, InstantiationException,
            IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException {
        new Test().m();
    }


    /* Reflection to set the data */
    @SuppressWarnings("unchecked")
    private void performMapping(Class clazz1, String methodName, Class[] clazz,
                                Object voObject, Double data)
            throws IllegalArgumentException, SecurityException,
            IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {
        for (Method m : clazz1.getMethods()) {
            System.out.println(m.getName()+ " " + Arrays.toString(m.getParameterTypes()));
        }
        clazz1.getMethod("set" + methodName, clazz).invoke(voObject, data);
    }

    public void setAddress1(Double arg) {
        System.out.println(arg);
    }
}
  1. Как указали другие авторы, вы добавили "set" два раза к имени метода
  2. Вы пытались передать String String data="TestData"; в качестве аргумента, даже если вы указали, что аргумент должен иметь тип Double: doubleArrayParamTypes[ 0 ] = Double.class;
0 голосов
/ 05 мая 2010

выстрел из бедра, но вы не пытаетесь получить метод setsetAddress1?

("set" + methodName)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...