假如我只知道接口中的方法名称比如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方法