java动态调用接口问题。

假如我只知道接口中的方法名称比如test1和test2(这2方法都已经有实现类实现),
那么我在另一个类中如何根据方法名称调用这2个方法?

接口 对象 = new 接口();

对象.方法()

动态的意思是什么?要问反射相关的东西嘛

如果不是android的话,用classloader找到方法类,然后初始化类对象,最后反射调用里边的方法

使用spring框架,在实现类上注解@service("自己定义"),然后在你需要调用的方法上面使用@Authod 接口名 自己定义;最后在你需要调用该方法的地方进行“自己定义.方法名“就可以了。

你这里说的test1和test2都有实现类,那你知道实现类的名称吗?如果知道实现类的名称,就好办,直接实例化实现类,调用方法就行;
代码可以参考下面
Class<?> clazz = Class.forName(“实现类名称(包括包路径)”);
接口 interf = (接口) clazz.newInstance();
Method m1 = clazz.getDeclaredMethod("test1");
m1.invoke(interf);//调用方法
如果实现类都不知道的话,那就不知道怎么调用了。

楼主,我直接上代码吧。比较懒,代码凌乱,看懂意思就行。。

接口是quartz的Job.class,方法是execute,如果方法多个参数,自己再修改

public class Demo implements Job {
    public static void main(String[] args) throws Exception {
        test(Job.class, "com.learn.test", "execute", JobExecutionContext.class,
                (JobExecutionContext)null);
    }

    public static void test(Class _interface,
                            String filterPackage,
                            String methodName,
                            Class methodParamClazz,
                            Object methodParamObj) throws Exception {
        //获取到加载的类的信息
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        Class cla = classLoader.getClass();
        while (cla != ClassLoader.class) {
            cla = cla.getSuperclass();
        }

        Field field = cla.getDeclaredField("classes");
        field.setAccessible(true);
        Vector v = (Vector) field.get(classLoader);
        for (int i = 0; i < v.size(); i++) {
            Class loadedClass = (Class)v.get(i);
            String className = loadedClass.getName();

            //适配到指定接口的子类
            if (className.contains(filterPackage) && _interface.isAssignableFrom(loadedClass)) {
                //调用方法
                Method method = loadedClass.getMethod(methodName, methodParamClazz);
                method.invoke(loadedClass.newInstance(), methodParamObj);
                return;
            }
        }
    }

哦 少了段

     @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("execute!!!");
    }

执行结果:
execute!!!

前提:假如我只知道接口中的方法名称比如test1和test2

Demo意思就是 我要调用第一个实现Job这个接口的类的execute方法