2016-03-16 81 views
2

我有這樣的代碼如何在類中爲所有setter方法創建新實例?

private PT_DSP def_PT = new PT_DSP(); 
... 
    def_PT.setVRTK(new VRTK()); 
    def_PT.getVRTK().setFILTER(new FILTER()); 
    def_PT.getVRTK().getFILTER().setMaskaTK(new MaskaTK()); 
    def_PT.getVRTK().getFILTER().getMaskaTK().setIdVer1(new IdVer1()); 
... 

我怎麼能對(新...()),例如FOR循環類def_PT ALL制定者創建新實例? 或者我該如何讀取類中的所有setter以準備調用? 不是Bean方法。 THX

+0

這裏的問題是,你想調用其他類的setter方法。如果所有的setter都在一個類中,也許這對於Apache BeanUtils是可行的。但是這樣更復雜。 –

+0

方法不需要初始化,但是數據成員可以這樣做,並且根本沒有使用setter方法的方法已經有兩種方法。不清楚你在問什麼, – EJP

回答

0

如果你想這樣做看看Method Chaining並改變你班上的方法。這樣,您可以嘗試做這樣

private PT_DSP def_PT = new PT_DSP().setVRTK(new VRTK().setFILTER(new FILTER()...); 

在方法的東西在類鏈的每個方法,總是返回當前實例,以便您可以使用它調用其他方法吧。

+0

我只知道def_PT,我需要初始化def_PT中的所有設置器。例如VRTK,FILTER,MaskaTK。我不知道def_PT中有多少個setter。 – NINJO

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

Mask都設置

過濾器設置

+0

在getParameterCount()的行是「方法getParameterCount()未定義的類型方法」,其中是調用「方法newInstance()未定義類型對象」 – NINJO

+0

您需要我添加的導入頂部java.lang。...) – jam

+0

我改變了method.invoke(next.newInstance(),parameters);到method.invoke(((Class)next).newInstance(),parameters); – NINJO

相關問題