说,我有一节课。
class Person{
private int id;
private String name;
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
public int getId(){
this.id = id;
}
public String getName(){
this.name = name;
}
}
像这样,我有多个数据传输类。我希望有一个类,它将动态地采用方法name
(String.class
)和参数value
(Object.class
),如下面的代码段所示。
class Mapper{
private Person person = new Person();
private Method method = null;
public void map(String methodName, Object parameterValue){
// 1. Get the method using methodName.
// 2. Get the method's parameter type.
// 3. Type cast 'parameterValue' to parameter type.
// 4. Call the method on 'person' object by passing type cast value
// from the 3-step(above).
}
}
我试过搜索它。我在Reflection API上得到了结果,如下面的代码段所示。
Class<String> clz = String.class;
for (Method m : clz.getDeclaredMethods()) {
System.err.println(m.getName());
int paramCount = m.getParameterTypes().length;
for (int i = 0; i < paramCount; i++) {
System.err.println(" arg" + i);
}
}
但是,这种方法不符合我的需要。希望你明白。
答案 0 :(得分:0)
如果您不想使用反射,我认为没有办法在Java中动态调用方法。 在使用Reflection API时,请查看Method类中的以下方法。
public Object invoke(Object obj, Object... args)
很明显,您不需要转换传递给此方法的参数。
答案 1 :(得分:0)
你可以这样做:
class Person {
public static final Map<String, BiConsumer<Person, ?>> methodMap = new HashMap<>();
static {
methodMap.put("setId", (BiConsumer<Person, Integer>) Person::setId);
methodMap.put("setName", (BiConsumer<Person, String>) Person::setName);
}
private int id;
private String name;
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
...
}
public <T> void map(String methodName, T parameterValue){
((BiConsumer<Person, ? super T>) Person.methodMap.get(methodName))
.accept(person, parameterValue);
}
我假设你只想在你的set方法中使用它,因为你总是想传递一个参数。
答案 2 :(得分:0)
如果你通过json,你可以在一行中完成,例如使用jackson:
private static ObjectMapper mapper = new ObjectMapper(); // it's threadsafe
然后在你的代码中:
Person person = mapper.readValue(mapper.writeValueAsString(map), Person.class);
您可以类似地使用Gson或您选择的其他json库。
一些测试代码:
import com.fasterxml.jackson.databind.ObjectMapper;
Map<String, Object> map = new HashMap<>();
map.put("id", 3);
map.put("name", "bob");
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(mapper.writeValueAsString(map), Person.class);
System.out.println(person.getId());
System.out.println(person.getName());
输出:
3
bob