如何在java中使用方法名获取参数类型?

时间:2016-06-05 15:15:18

标签: java methods reflection parameters

说,我有一节课。

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;
    }
}

像这样,我有多个数据传输类。我希望有一个类,它将动态地采用方法nameString.class)和参数valueObject.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);
   }
}

但是,这种方法不符合我的需要。希望你明白。

3 个答案:

答案 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