如何为类中的所有setter方法创建新实例?

时间:2016-03-16 08:06:34

标签: java class initialization setter

我有这段代码

library(reshape2)
melt(df2, id = 'id', na.rm = TRUE)

#     id variable value
#  1   1     str1    NI
#  2   2     str1    FA
#  3   3     str1    FI
#  4   4     str1   FST
#  5   5     str1    FA
#  6   6     str1    IA
#  7   7     str1    NI
#  8   8     str1    IA
#  9   9     str1    IA
#  10 10     str1    FA
#  11 11     str1    IA
#  16  5     str2    NI
#  17  6     str2    FI
#  18  7     str2    DI
#  19  8     str2    NI
#  20  9     str2    FT
#  21 10     str2    FT
#  22 11     str2   FST
#  28  6     str3    IO
#  30  8     str3    IO
#  31  9     str3    FI
#  32 10     str3    FI
#  33 11     str3    FI

如何在类def_PT on(new ...())中为所有setter创建新实例,例如FOR循环? 或者我如何读取类中的所有setter以准备调用数组? 不是Bean方法。 THX

2 个答案:

答案 0 :(得分:0)

如果你想这样做,请查看Method Chaining并更改班级中的方法。有了它,你可以尝试做像

这样的事情
private PT_DSP def_PT = new PT_DSP().setVRTK(new VRTK().setFILTER(new FILTER()...);

在链接类中每个方法的方法中,总是返回当前实例,以便您可以使用它来调用其中的其他方法。

答案 1 :(得分:0)

你可以使用反射并调用参数的所有设置者递归

import java.lang.Object;
import java.lang.reflect.Method;

...

class Filter {
public void setMask(Mask mask){
    System.out.println("Mask set");
}
public void doSmth(){}

}

...

class Mask {
}

...

class PT_DSP {
    public void setFilter(Filter filter){
        System.out.println("Filter set");
    }
    public void doSmth(){}
}

...

public class SetterTest {


    private PT_DSP def_PT = new PT_DSP();

    @Test
    public void init() throws InstantiationException, IllegalAccessException, InvocationTargetException {
        initSetters(def_PT);
    }

    public void initSetters(Object next) throws IllegalAccessException, InstantiationException, InvocationTargetException {

        Method[] methods = next.getClass().getMethods();

        for(Method method : methods){
            if (method.getName().contains("set")){

                System.out.println(method.getName());
                Class[] parameterTypes = method.getParameterTypes();

                // parameters of setter
                List<Object> parameters = new ArrayList<>();

                for (Class type : parameterTypes) {

                    // generate new instance of parameter
                    Object object = type.newInstance();

                    // add parameter, for setter call later on
                    parameters.add(object);

                    // call recursive for parameter setters
                    initSetters(object);
                }
                // call setter, with new instane of target
                method.invoke(next.newInstance(), parameters.toArray());

            }
        }
    }


}
  

使用setfilter

     

setMask

     

面具集

     

过滤器集