是否有一个用于Java反射的通用"后端"库

Dav*_*Ray 11 java reflection dynamic invoke

我目前正在使用用Java实现的专门的,解释性的编程语言.作为该语言的一小部分,我想添加调用Java的能力.在深入研究反射的所有细节之前,我想知道是否有人知道一个通​​用库来执行反向调用Java代码的"后端"部分.

也就是说,我将一个字符串(我定义语法)解析为一些表示Java方法调用(或构造函数或字段访问)的数据结构,然后将该数据结构传递给调用该调用并返回结果的库.特别是,我希望它已经处理了我不想弄清楚的所有边缘情况:

  • 根据参数类型自动选择正确的方法(如智能Class.getDeclaredMethod())
  • 处理数组和普通对象引用之间的区别
  • 等等

我花了一点时间在JVM上查看动态语言的实现,但这些通常比我正在寻找的要复杂得多,或者针对特定语言进行了高度优化.

另一个选择是将我的语法转换为某种动态语言的字符串,并使用Rhino或其他东西调用它,但这比我正在寻找的开销稍微多一些.

谢谢!

fli*_*ken 7

尝试FEST Reflection模块.这是一种流畅的Java反射方式.例如:

 String name = method("get").withReturnType(String.class)
                         .withParameterTypes(int.class)
                         .in(names)
                         .invoke(8);
Run Code Online (Sandbox Code Playgroud)


Ben*_*eim 7

只是评论你自己的答案; 实际上,beanutils支持在给定一组参数的情况下获得"紧密匹配".请参阅getMatchingAccessibleMethod()

BeanUtils非常强大,并且有许多用于检查类的实用方法.构造函数自然可以获得相同的支持.


Luk*_*der 6

如果您追求简单性,我创建了一个名为jOOR的简单库,以便于访问 Java 中的反射 API。它支持最基本的操作,而无需构建庞大的 API。下面是 jOOR 代码的示例:

String world = 
on("java.lang.String") // Like Class.forName()
.create("Hello World") // Call the most specific matching constructor
.call("substring", 6)  // Call the most specific matching substring() method
.call("toString")      // Call toString()
.get()                 // Get the wrapped object, in this case a String
Run Code Online (Sandbox Code Playgroud)