2011-06-27 72 views
1

我希望創建一個將執行一些操作的功能通過類名(出現時間最多) 我創建功能像下面如何在函數參數

public void doSth() 
{ 
    //logic 
    ClassName.staticMethod(); 
    //logic 
} 

在我的應用程序有很多次這樣的功能叫做。只有特定的行會被改變。我決定給一個共同的功能。

現在我的問題是:如何在函數參數中傳遞ClassName,以便函數體能夠動態使用它?

感謝

+0

我的錯誤,我剛來到這裏的格式,它做... – Pedantic

+0

這件事情,你張貼的問題在所有之前,你應該做的。在問題區域的右側有方便的** How to Format **框,在它上方有** [?] **鏈接,並在其下方有一個預覽,以便您可以檢查發佈時的外觀。 –

回答

1

您可以使用class.forName()方法來獲得所需的類的實例..看到更多here

1

我建議你考慮重構你的代碼,並指定接口作爲參數類型。

你可以例如使用Runnable和簡單做arg.run()而不是ClassName.staticMethod()

例子:

public void doSth(Runnable action) { 
    // logic 
    action.run(); 
    // logic 
} 
+0

@Downvoter,留言留下評論? – aioobe

+0

'Runnable'是專門用於在自己的線程上運行的東西。從[文檔](http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html):*「Runnable'接口應該由任何實例用於實例的類實現「(不是我的downvote。) –

+0

這不僅僅是你,有人決定匆匆通過,並downvote所有的答案,除了我的。對我來說似乎有點苛刻。 –

5

你能做到這一點,通過Class.forName它接受一個完全合格的類名,並返回一個Class實例。然後,您必須通過getMethod獲得有關靜態方法的Method,並通過invoke調用它。

但是將類名作爲字符串傳遞是一個可疑的設計決定。我會看看替代方法,比如使用單例而不是靜態方法和接口,諸如此類。

1

你可以傳遞兩個字符串,一個是類,另一個是方法名。 然後你只需要調用Class.forname(classname).getMethod(classname, null).invoke(null, null)

編輯:只有當方法是靜態的並且沒有參數時纔有效(否則你會用其他值替換空值)。編輯:你得到的其他選項(如提到的類和方法的字符串並不好),是聲明一個接口,並使所有的類與staticMethod實現它(如果有必要一個包裝方法來調用真正的靜態方法類,如果staticMethod名稱在所有類中都不相等),那麼您只需使用interface-Type作爲參數。

2

您可能想要直接傳遞該類,而不是其名稱(否則使用Class.forName)。然後,它只是一個使用反射調用它的事:)

public void doSth(Class<?> clazz) throws NoSuchMethodException, 
     IllegalAccessException, IllegalArgumentException, 
     InvocationTargetException { 
    Method method = clazz.getMethod("staticMethod"); 
    if (Modifier.isStatic(method.getModifiers())) { 
     Object result = method.invoke(null); 
     //do sth with result 
    } else { 
     // ... 
    } 
} 
+0

看起來像比字符串傳遞類名更好的解決方案+1 –

-1

使用java的反射機制

公共無效someFunction({

this.getClass()。的getName(); //返回

}的名稱

所以這樣你就不需要傳遞任何參數

+1

他有類的名字,他需要對象(而不是這個類)。 – flolo

1

更優雅的解決方案是使用strategy pattern。該代碼將變爲


void f(X x) { 
    // some code 
    IStrategy strategy = decideStrategy(x); 
    strategy.method(); 
    // rest of the logic 
} 
0

。利用getCount將()的GetItem()方法,在你的適配器來實現這一目標: 下面列表是要傳遞到烏爾適配器的數據源,

public int getCount() { 
    int count=0; 
    for(int i=0;i<list.size();i++) 
    { 
     if(//ur condition to include the item) 
     { 
      count++; 
     } 
    } 
    return count; 
} 

@Override 
public Object getItem(int position) { 


    if(//ur condition to include the item) 
    { 
     return list.get(position); 

    } 
    else 
    { 
     return null; 
    } 
} 

在getview()

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.urlayout, parent, false); 



    if(list.get(position)!=null) { 


    } 

    return convertView; 
}