首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何才能得到“methods 1.methods 2”ClassLoader这样的方法?

如何才能得到“methods 1.methods 2”ClassLoader这样的方法?
EN

Stack Overflow用户
提问于 2013-07-27 22:11:56
回答 1查看 638关注 0票数 0

我是Java中的ClassLoader新成员。那么,我如何才能调用类似

代码语言:javascript
复制
getDefault().GetImage();

这是我目前的代码:

代码语言:javascript
复制
ClassLoader tCLSLoader = new URLClassLoader(tListURL);
Class<?> tCLS = tCLSLoader.loadClass("com.github.sarxos.webcam.Webcam");

// MY FAILED TEST
Method tMethod = tCLS.getDeclaredMethod("getDefault().GetImage"); 
tMethod.invoke(tCLS,  (Object[]) null);

编辑:

我试过这个:

代码语言:javascript
复制
Method tMethod1 = tCLS.getDeclaredMethod("getDefault");
Object tWebCam = tMethod1.invoke(tCLS,  (Object[]) null);

// WebCam - Class
Class<?> tWCClass = tWebCam.getClass();


Method tMethod2 = tWCClass.getDeclaredMethod("getImage");
tMethod2.invoke(tWCClass, (Object[]) null);

但我明白:

代码语言:javascript
复制
java.lang.IllegalArgumentException: object is not an instance of declaring class

我需要得到这个结果:

代码语言:javascript
复制
BufferedImage tBuffImage = Webcam.getDefault().getImage();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-27 22:42:16

你不能这样做,这不是反射的工作方式。

您需要将String拆分为.,然后依次循环和调用方法。

这应该能行

代码语言:javascript
复制
private static Object invokeMethods(final String methodString, final Object root) throws Exception {
    final String[] methods = methodString.split("\\.");
    Object result = root;
    for (final String method : methods) {
        result = result.getClass().getMethod(method).invoke(result);
    }
    return result;
}

快速测试:

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    final Calendar cal = Calendar.getInstance();
    System.out.println(cal.getTimeZone().getDisplayName());
    System.out.println(invokeMethods("getTimeZone.getDisplayName", cal));
}

输出:

代码语言:javascript
复制
Greenwich Mean Time
Greenwich Mean Time
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17902961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档