我希望創建一個將執行一些操作的功能通過類名(出現時間最多) 我創建功能像下面如何在函數參數
public void doSth()
{
//logic
ClassName.staticMethod();
//logic
}
在我的應用程序有很多次這樣的功能叫做。只有特定的行會被改變。我決定給一個共同的功能。
現在我的問題是:如何在函數參數中傳遞ClassName,以便函數體能夠動態使用它?
感謝
我希望創建一個將執行一些操作的功能通過類名(出現時間最多) 我創建功能像下面如何在函數參數
public void doSth()
{
//logic
ClassName.staticMethod();
//logic
}
在我的應用程序有很多次這樣的功能叫做。只有特定的行會被改變。我決定給一個共同的功能。
現在我的問題是:如何在函數參數中傳遞ClassName,以便函數體能夠動態使用它?
感謝
您可以使用class.forName()
方法來獲得所需的類的實例..看到更多here
我建議你考慮重構你的代碼,並指定接口作爲參數類型。
你可以例如使用Runnable
和簡單做arg.run()
而不是ClassName.staticMethod()
。
例子:
public void doSth(Runnable action) {
// logic
action.run();
// logic
}
@Downvoter,留言留下評論? – aioobe
'Runnable'是專門用於在自己的線程上運行的東西。從[文檔](http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html):*「Runnable'接口應該由任何實例用於實例的類實現「(不是我的downvote。) –
這不僅僅是你,有人決定匆匆通過,並downvote所有的答案,除了我的。對我來說似乎有點苛刻。 –
你能做到這一點,通過Class.forName
它接受一個完全合格的類名,並返回一個Class
實例。然後,您必須通過getMethod
獲得有關靜態方法的Method
,並通過invoke
調用它。
但是將類名作爲字符串傳遞是一個可疑的設計決定。我會看看替代方法,比如使用單例而不是靜態方法和接口,諸如此類。
你可以傳遞兩個字符串,一個是類,另一個是方法名。 然後你只需要調用Class.forname(classname).getMethod(classname, null).invoke(null, null)
。
編輯:只有當方法是靜態的並且沒有參數時纔有效(否則你會用其他值替換空值)。編輯:你得到的其他選項(如提到的類和方法的字符串並不好),是聲明一個接口,並使所有的類與staticMethod實現它(如果有必要一個包裝方法來調用真正的靜態方法類,如果staticMethod名稱在所有類中都不相等),那麼您只需使用interface-Type作爲參數。
您可能想要直接傳遞該類,而不是其名稱(否則使用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 {
// ...
}
}
看起來像比字符串傳遞類名更好的解決方案+1 –
使用java的反射機制
公共無效someFunction({
this.getClass()。的getName(); //返回
類}的名稱
所以這樣你就不需要傳遞任何參數
他有類的名字,他需要對象(而不是這個類)。 – flolo
更優雅的解決方案是使用strategy pattern。該代碼將變爲
void f(X x) {
// some code
IStrategy strategy = decideStrategy(x);
strategy.method();
// rest of the logic
}
。利用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;
}
我的錯誤,我剛來到這裏的格式,它做... – Pedantic
這件事情,你張貼的問題在所有之前,你應該做的。在問題區域的右側有方便的** How to Format **框,在它上方有** [?] **鏈接,並在其下方有一個預覽,以便您可以檢查發佈時的外觀。 –