当前位置: 首页 > 知识库问答 >
问题:

Java反射:确定JRuby中java.util.regex.模式的类

白驰
2023-03-14

在Java 11下运行的旧式JRuby应用程序(1.6.8)上,我跟踪了一个特殊的错误:测试用例:“需要'Java';放置Java::util::regex::Pattern.class”错误参数错误:参数数量错误(0代表1)。对于其他内置的JRE类,这似乎工作得很好(见下文)。

这有时会导致JRuby本身失败,具体到https://github.com/jruby/jruby/blob/1.6.8/lib/ruby/site_ruby/shared/builtin/javasupport/core_ext/object.rb#L10 :

if self.class.superclass.instance_method(:method_added) != method(:java_package_method_added)

为了让应用程序正常工作,我不得不在JRuby源代码中注释掉这一行。

我对这一问题的原因感到困惑,或者如何适当地解决它。谷歌展示了一些人在加载特定应用程序时出错的例子,但没有人知道原因(所有的解决方案都说“尝试不同版本的应用程序”)。

为什么JRuby不能执行。类?它期待什么样的论据?

完成以下跟踪:

$ java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

$ ./jruby -v
jruby 1.6.8 (ruby-1.8.7-p357) (2012-09-18 1772b40) (Java HotSpot(TM) 64-Bit Server VM 11.0.1) [linux-amd64-java]

$ ./jruby -e "require 'java'; puts java::util::regex::Matcher.class"
WARNING: An illegal reflective access operation has occurred
...
Class

$ ./jruby -e "require 'java'; puts java::lang::String.class"
WARNING: An illegal reflective access operation has occurred
...
Class

$ ./jruby -e "require 'java'; puts java::util::regex::Pattern.class"
WARNING: An illegal reflective access operation has occurred
....
ArgumentError: wrong number of arguments (0 for 1)
  (root) at -e:1

Java本身似乎没有问题:

jshell> int.class
$6 ==> int

jshell> String.class
$7 ==> class java.lang.String

jshell> Pattern.class
$8 ==> class java.util.regex.Pattern

jshell> Pattern.class.getClass()
$12 ==> class java.lang.Class

jshell> String.class.getClass()
$13 ==> class java.lang.Class

我可以在JRuby中通过注释掉上面引用的if语句来修复这个错误。然而,在这个遗留应用程序上,JRuby位于已编译的jar中,因此我无法编辑其源代码。有没有一种方法可以在不改变二进制jar的情况下向JRuby添加monkey补丁来修复失败的if语句?

JRuby 1.6.8可在http://central.maven.org/maven2/org/jruby/jruby-dist/1.6.8/

共有1个答案

郝昊天
2023-03-14

我认为jruby是试图读取模式类的成员之一:

private static int getClass(int c) {
    return sun.text.Normalizer.getCombiningClass(c);
}

因为它看起来有点像getter,但是有额外的参数。

您可以通过如下方式创建自己的类来确认:

class MyClass {
    private static int getClass(int c) {
        return 4;
    }
}

然后尝试从JRuby中获取类。

它适用于java 8,因为这种方法是非静态的,就像霍尔格所说的,jruby似乎更喜欢使用现有的静态方法,即使它们不匹配签名,并在最后检查特殊的“. class”属性。(如javaSomething.class不是一个属性,而只是一个关键字)

最好的选择是对匹配调用的方法(0个需要的参数)具有更高的优先级,并且可能对公共方法具有更高的优先级。而且,只有当getter是真正的getter时,才应该用属性名匹配它们,所以它们并没有任何参数。

下载此版本的jruby对我不起作用,因此我无法测试:https://www.jruby.org/files/downloads/1.6.8/index.html

 类似资料:
  • 问题内容: 我正在遍历Jar文件中的类,希望找到那些不是抽象的类。我可以通过实例化类并捕获InstantiationException来解决此问题,但是由于某些类的启动工作量很大,因此性能会受到影响。我在Class.java文档中找不到明显类似于isAbstract()的东西。 问题答案: 当您在类对象上调用getModifiers()时,它将抽象作为其修改器之一。 该链接应该有所帮助。 也: h

  • 本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。 1. 什么是反射 Java 的反射(reflecti

  • 问题内容: 是否有与.NET Reflector等效的Java ? 编辑:更具体地说,反编译是我的追求。 问题答案: 我几乎不知道.NET Reflector的功能在包括Eclipse在内的几乎所有Java IDE中都可用。只需将文件添加到项目中,就可以像浏览自己的类一样浏览其类。 对于反编译器方面(与纯类浏览器相反),还有一些替代方法。JDK工具仅反编译为字节码,因此获取源代码并没有什么用(但是

  • 问题内容: 我正在尝试使用Java做反射 我想在通过不指定包名作为字符串将包含多个子包中的类说,.... 可能吗? 如果在这种情况下我有很多子包,那么进行大小写切换以预先挂在不同的子包上是不可行的。 问题答案: 首先,使用Reflections库获取所有类 接下来,建立一个查找映射。 当您需要查找课程时,您可以执行以下操作:

  • Java 提供了 java.util.regex 包,用于与正则表达式进行模式匹配。

  • 本文向大家介绍Go语言中反射的正确使用,包括了Go语言中反射的正确使用的使用技巧和注意事项,需要的朋友参考一下 介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题,在使用前需要三思: 大量的使用反射会损失一定性能 Clear is better than clever. Reflectio