我想创建一个执行某些操作的函数(大部分时间都在发生) 我创建了如下的函数
public void doSth()
{
//logic
ClassName.staticMethod();
//logic
}
在我的应用程序中,有很多次会调用此函数。只有特定的行才会改变。我决定提供一个共同的功能。
现在我的问题是:如何在函数参数中传递ClassName,以便函数体动态地使用它?
由于
答案 0 :(得分:5)
您可以通过Class.forName
接受完全限定的类名并返回Class
实例。然后,您必须通过getMethod
获取相关静态方法的Method
,然后通过invoke
调用它。
但是将类名作为字符串传递是一个可疑的设计决定。我会看一些替代方案,例如使用单例而不是静态方法和接口,等等。
答案 1 :(得分: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 {
// ...
}
}
答案 2 :(得分:1)
您可以使用class.forName()
方法获取所需类的实例..查看更多here
答案 3 :(得分:1)
我建议您考虑重构代码并将接口指定为参数类型。
例如,您可以使用Runnable
而只需使用arg.run()
代替ClassName.staticMethod()
。
示例:强>
public void doSth(Runnable action) {
// logic
action.run();
// logic
}
答案 4 :(得分:1)
你可以传递两个字符串,一个用类,一个用方法名。
然后,您只需使用Class.forname(classname).getMethod(classname, null).invoke(null, null)
调用。
编辑:仅当方法是静态且没有参数时才有效(否则你会用其他值替换空值)。
编辑:你得到的其他选项(如提到的类和方法的字符串都不好),是声明一个接口并使所有带有staticMethod的类实现它(如果需要的话,可以使用包装器方法为类调用真正的静态方法) ,如果staticMethod名称在所有类中都不相等),那么你只需使用interface-Type作为参数。答案 5 :(得分:1)
更优雅的解决方案是使用strategy pattern。代码将更改为
void f(X x) {
// some code
IStrategy strategy = decideStrategy(x);
strategy.method();
// rest of the logic
}
答案 6 :(得分: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;
}
答案 7 :(得分:-1)
使用java的反射机制
public void someFunction(){
this.getClass()。getName(); //返回类的名称
}
所以这样你不需要传递任何参数