Java反射 根据不同方法名动态调用不同的方法

list页面的字段要求可以根据用户的喜好进行排序,所以每个用户的字段都对应着不同的顺序(字段顺序存数据库),我们从数据库里取出来的值是对象,但是前台传值是用的ajax和json array,所以就面临着一个对象到json的转换问题:1. 每个用户的字段顺序不固定,代码不能写死, 2. 根据用户字段顺序去取值,如果用if判断每个值然后调用不同的方法,if条件语句太多。然后就看了下反射。

Model 类,跟正常model一样

public class Person {

    private String name;
    private int age;
    private String address;
    private String phoneNumber;
    private String sex;


    public String getName() {
        return name;
    }
// 以下是get 和set方法,省略。
}

测试类

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Test {

    // init person object.
    private Person initPerson() {
        Person p = new Person();

        p.setName("name");
        p.setAge(21);
        p.setAddress("this is my addrss");
        p.setPhoneNumber("12312312312");
        p.setSex("f");

        return p;
    }
    
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Test test = new Test();
        Person p = test.initPerson();
        List<String> list = new ArrayList<String>();

        // Add all get method.

        // There is no ‘()’ of methods name.

        list.add("getName");
        list.add("getAge");
        list.add("getAddress");
        list.add("getPhoneNumber");
        list.add("getSex");
        
        for (String str : list) {

    // Get method instance. first param is method name and second param is param type.

    // Because Java exits the same method of different params, only method name and param type can confirm a method.

            Method method = p.getClass().getMethod(str, new Class[0]);

    // First param of invoke method is the object who calls this method.

    // Second param is the param.

            System.out.println(str + "():  Get Value is   " + method.invoke(p, new Object[0]));
        }
    }
}

这样就可以根据数据库获取的字段遍历从对象去取相应的值了


上面那个方法是要给list添加get方法名,才能根据相应的get方法名去获取值,如果前台传过来的只是一个属性名,那我们还要转换成相应的get方法,麻烦。

public static void getValueByProperty(Person p, String propertyName) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        // get property by the argument propertyName.
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());
        Method method = pd.getReadMethod();
        Object o = method.invoke(p);
        System.out.println("propertyName: " + propertyName + "\t    value is:   " + o);
    }
    
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException {
        Test test = new Test();
        Person p = test.initPerson();
        

// get all properties.
        Field[] fields = p.getClass().getDeclaredFields();
        for (Field field : fields) {
            getValueByProperty(p, field.getName());
        }  
    }


这样就能直接通过传过来的propertyName获取对应的value值了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值