Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口反射替代方案_Java_Generics_Reflection_Interface - Fatal编程技术网

Java接口反射替代方案

Java接口反射替代方案,java,generics,reflection,interface,Java,Generics,Reflection,Interface,我正在开发一个应用程序,该应用程序将Java接口用作Java接口以外的其他接口,即在运行时,用户应该能够列出接口类中的可用方法,这些方法可以是: private Class<? extends BaseInterface> interfaceClass. 私有类 我的问题是:Java“接口”架构是否为我提供了任何方法来查看和调用方法,而不使用反射API a) 不,反射是唯一的方法 b) 别那么做。如果需要动态语言,请使用Groovy。它的语法(可以)与java几乎相同,但它已经内置

我正在开发一个应用程序,该应用程序将Java接口用作Java接口以外的其他接口,即在运行时,用户应该能够列出接口类中的可用方法,这些方法可以是:

private Class<? extends BaseInterface> interfaceClass.
私有类
我的问题是:Java“接口”架构是否为我提供了任何方法来查看和调用方法,而不使用反射API

a) 不,反射是唯一的方法


b) 别那么做。如果需要动态语言,请使用Groovy。它的语法(可以)与java几乎相同,但它已经内置了大部分功能。(许多其他语言也可以使用,但Groovy在比较语法时最接近Java)

这正是构建反射的目的。

反射是列出任意对象方法的唯一方法。嗯,解析字节码也很有效,但它很乏味。

不幸的是,反射似乎是唯一的方法。不幸的是,反射不仅速度较慢,而且编程和维护也很麻烦。所以我建议您使用ApacheBeanutil库。(特别是。)

看看。它是一个很好的库,可以通过编程轻松地发现对象的方法和属性(即,无需编写低级反射代码)。我已经在几个项目中使用过它。它还提供了一个更简单的API,用于在发现这些对象成员后访问它们。并且是很好的起点。

虽然这里没有办法绕过反射,但是如果您使用注释来标记可调用的方法,可以相对轻松地实现反射。这种方法的一个例子是webservices的注释集。这里使用的想法可能非常有用,例如,您可以为每个方法/参数定义一个显示名称。

带有注释的反射工作得很好

for (Method m : interfaceClass.getMethods()) {
         if (m.isAnnotationPresent(UIf.class)) {
            UIf x = m.getAnnotation(UIf.class);
            addDefinedCommand( new CommandDef(
                    interfaceClass, 
                    u, 
                    x.name().isEmpty() ? m.getName() : x.name(), 
                    x.description()) 
            );
         }
 }

还有其他方法,但它们比我更糟糕。你还没有说你为什么不想使用反射。您可以动态生成代码(并通过自定义类加载器加载代码)。。。但反射实际上就是这么做的,这是一个错误的说法。您几乎可以动态生成代码,代理和反射在幕后完成。也可以手工操作。@bestsss当你得到一个
对象
实例时,如何“手工”列出它的方法?@Bozho,你得到它的类(Object.getClass())找到类资源
(ClassLoader.getResource(className.replace('.','\')+.class))
,加载资源,解析常量池,然后就完成了……好吧,有库可以这样做(例如bcel),但这就是过程……实际上bcel和asm都是Sun JDK的一部分(虽然不是正式的,但Sun也使用它们),所以不需要额外的库。是的,你可以解析字节码。但是getResource(…)类可能不起作用-类不一定需要
.class
文件。javascript有什么问题吗?它甚至在java中也可用?@bestsss JS没有什么问题,它是一种很棒的语言,我从来没有说过别的。但是当你提出建议时,你必须开始一些我从来没有暗示过你说过任何关于javascript的事情,只是想知道为什么它不是第一选择。
for (Method m : interfaceClass.getMethods()) {
         if (m.isAnnotationPresent(UIf.class)) {
            UIf x = m.getAnnotation(UIf.class);
            addDefinedCommand( new CommandDef(
                    interfaceClass, 
                    u, 
                    x.name().isEmpty() ? m.getName() : x.name(), 
                    x.description()) 
            );
         }
 }