首先,我知道这违反了所有惯例和建议,但无论如何我想这样做。
\n我如何(或者是否有可能)在标识符(方法名称、变量名称等)中使用 Unicode 字符来编译 Java 代码?
\n我希望能够执行以下操作:
\npublic class extends {\n public void \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xa7\xd1\x82\xd0\xbe\xd0\xbd\xd0\xb8\xd0\xb1\xd1\x83\xd0\xb4\xd1\x8c() { ... }\n}\n
Run Code Online (Sandbox Code Playgroud)\n这是一个完全荒谬的例子,但你明白了。
\n标识符必须以所谓的Java 字母开头,即
\n\n\n\n\n
Character.isJavaIdentifierStart(int)
[...] 该方法返回的字符true
。
\n\n\n
ch
当且仅当以下条件之一为真时,字符 [ ] 可以启动 Java 标识符:\n
\n- \n
isLetter(ch)
返回真- \n
getType(ch)
返回 LETTER_NUMBER- \n
ch
是货币符号(例如\'$\')- \n
ch
是连接标点字符(例如\'_\')。
(可选)后续字符必须是Java 字母或数字,即
\n\n\n\n\n
Character.isJavaIdentifierPart(int)
[...] 该方法返回的字符true
。
\n\n如果满足以下任一条件,则字符可能是 Java 标识符的一部分:
\n\n
\n- 这是一封信
\n- 它是货币符号(例如“$”)
\n- 它是一个连接标点符号(例如\'_\')
\n- 它是一个数字
\n- 它是一个数字字母(例如罗马数字字符)
\n- 这是一个组合标记
\n- 它是一个非间距标记
\n- \n
isIdentifierIgnorable
返回该字符的 true
对于 或 来说,上述情况都不成立,但\xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xa7\xd1\x82\xd0\xbe\xd0\xbd\xd0\xb8\xd0\xb1\xd1\x83\xd0\xb4\xd1\x8c
事实上,它是一个有效的标识符。
你可以做的(何苦呢)是编写一个预处理器,将这些表情符号转换为 Java 字母序列,其输出是一个带有有效标识符的 java 程序,你最终可以将其提供给编译器。
\n