[英]NoSuchMethodException while using JAVA Reflection
嗨,我正在嘗試使用反射來調用方法並更新該方法的setter值。 但是我在獲取該方法時遇到了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;
我所看到的是,您傳遞了setAddress1
並將其與set
連接起來,從而得到setsetAddress1
。 傳遞屬性名稱並將其大寫,或從串聯中刪除該set
。
同樣,您提供的代碼將無法編譯。 你不能有一個叫做class
的變量
從臀部射擊,但是您不是要獲取setsetAddress1
方法嗎?
( "set" + methodName
)
下面的代碼有效。 您有兩個錯誤(語法上的類名錯誤除外):
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);
}
}
String
String data="TestData";
作為參數,即使您指定該參數的類型應該為Double
: doubleArrayParamTypes[ 0 ] = Double.class;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.