繁体   English   中英

我怎么能扩展java.util.Scanner类来添加nextChar()方法?

[英]How could I extend java.util.Scanner class to add a nextChar() method?

这个问题纯粹是学术性的(我将从C#背景进入Java)。

我想知道如何扩展java.util.Scanner类以添加Scanner.nextChar()方法。

(请注意,答案可能不是特定于Scanner.nextChar() ,而是关于扩展本机类的一般步骤。非常感谢。)

Scannerfinal课,你不能扩展它。 如果它是非最终类,你可以扩展它。 正如Dennis建议的那样,您可以使用BufferedReader#Read方法读取单个字符。

也许扩展Reader并模拟BufferedReader

由于Scannerfinal您无法声明它的子类。 期。

  • 反思不会起作用/帮助。
  • 字节工程技巧不起作用/帮助。

可以想象,您可以修改 Scanner类以删除final修饰符。 但是,这是类的事实是在一个保留包中意味着您需要修改 Java安装才能实现这一点。 (你也可以通过修改bootclasspath来做到这一点......但这相当于同样的事情。)

但说实话,如果没有必要修改Scanner 相反,您可以简单地复制Scanner源代码(例如,从OpenJDK代码库)并使用它在应用程序的包空间中创建一个具有额外方法的“无关”类。 它不会通过类型与真正的Scanner类相关,但这不太可能是一个问题。


作为记录:

  • 此问答 - https://stackoverflow.com/a/18746676/139985 - 提供了Scanner不支持readChar一些可能原因。 (当然注意到它显然是“意见”。)

  • 使Scanner最终的最可能原因是安全性。 final Scanner类意味着Scanner实例可以安全地从不受信任的代码传递到沙盒环境中的受信任代码。

要模拟nextChar您可以尝试使用next和空分隔符。

Scanner s = new Scanner("a\nb\tcd\re");
Pattern original = s.delimiter();// in case you wnat to get back to
                                // default delimiter

s.useDelimiter("");

while (s.hasNext()) {
    char c = s.next().charAt(0);
    System.out.println("'" + c + "'");
}

结果

'a'
'      (here is printed value of `\n`) 
'
'b'
'   '  (here is printed value of `\t`) 
'c'
'd'
'      (here is printed value of `\r`) 
'
'e'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM