如何在函数参数中传递类名

时间:2011-06-27 09:19:05

标签: java

我想创建一个执行某些操作的函数(大部分时间都在发生) 我创建了如下的函数

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

在我的应用程序中,有很多次会调用此函数。只有特定的行才会改变。我决定提供一个共同的功能。

现在我的问题是:如何在函数参数中传递ClassName,以便函数体动态地使用它?

由于

8 个答案:

答案 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(); //返回类的名称

}

所以这样你不需要传递任何参数