27

Java の予約語を変数、メソッド、クラス、インターフェース、パッケージ、または列挙定数名として使用するトリッキーな方法はありますか?

4

13 に答える 13

40

これは有効な質問です。そういうこと他の言語でも可能です。C# では、識別子の前に@(前に尋ねたように) を付けます。Delphi では、プレフィックスとして&. しかし、Java にはそのような機能はありません (.Net の世界のように、他の言語で定義された識別子と実際に対話する必要がないためです)。

于 2009-01-08T12:48:22.773 に答える
30

いいえ、方法はありません。そのため、「予約済み」というラベルが付けられています。

于 2009-01-08T11:49:55.560 に答える
11

ほとんどの場合、この問題は「クラス」で発生します。この場合、「クラズ」と書くのが通例です。

于 2009-01-08T11:54:19.793 に答える
7

いいえ、これはできません。詳細については、JLSセクション3.8、3.9を参照してください。

ASCII文字から形成された次の文字シーケンスは、キーワードとして使用するために予約されており、識別子として使用することはできません(§3.8)。

Keyword: one of
        abstract    continue    for           new          switch
        assert      default     if            package      synchronized
        boolean     do          goto          private      this
        break       double      implements    protected    throw
        byte        else        import        public       throws
        case        enum        instanceof    return       transient
        catch       extends     int           short        try
        char        final       interface     static       void 
        class       finally     long          strictfp     volatile
        const       float       native        super        while
于 2009-01-08T11:56:28.073 に答える
7

厳密に言えば、Java 言語仕様に準拠していないバグのあるコンパイラ実装を手に入れない限り、それはできません。

しかし、意志あるところに道は開けます。次のコードを IDE にコピーし、ソース ファイルのエンコーディングを UTF-16 に切り替えます。

public class HelloWorld {

    public static void main(String[] args) {

        HelloWorld.nеw();
    }

    public static void nеw () {
        System.out.println("Hello,World");
    }

}

このコードは整形式で有効な Java クラスです。ただし、ご想像のとおり、ちょっとしたトリックがあります。"new" 識別子内の 'е' 文字は ASCII 文字セットに属しておらず、実際にはキリル文字の 'е' (発音は 'YE') です。

現在の Java 言語仕様では、識別子の命名に Unicode を使用することが明示的に許可されており、これは重要なポイントです。つまり、必要に応じて、フランス語、中国語、またはロシア語で自分のクラスを自由に呼び出すことができるということです。コード内でアルファベットを組み合わせることも可能です。そして歴史的に、ラテン文字やその他のアルファベットの一部の文字は似ています。

結果: いいえ、予約語を識別子として使用することはできませんが、予約語とまったく同じように見える識別子を使用できます。

誰かがそれをやるべきかどうかは、まったく別の問題です。

于 2009-01-14T20:18:06.960 に答える
4

はいあります。将来の予約語を使用する必要があります。1.4より前のコードでassert()と呼ばれるさまざまなメソッドで起こったことのように。

それが役に立てば幸い!

于 2009-01-08T11:59:15.790 に答える
3

何をしようとしているのかわかりませんが、$ は識別子の有効な文字であるため、次のように言えます。

int $return = 5;

少し奇妙に見えますが、機能します。

于 2009-01-09T00:03:18.137 に答える
3

Scala では、バックティックを使用できます。例: myVarialbe.`class`

于 2012-09-12T17:21:01.150 に答える
2

は?なぜあなたはそれをしたいのですか?あなたはそれらをl33tで書くことができます、それはコンパイラをだますでしょう。

class cl4ss {
  String r3turn() {
    return "but why?";
  }
}
于 2009-01-08T11:49:22.550 に答える
2

PL/1 (1960 年代の IBM メインフレーム プログラミング言語で、現在も使用されています) では、一部の単語が特定のコンテキストでキーワードのように機能する一方で、すべての単語を識別子として使用できることを要求したことは有名です。パーサーで一貫性を持たせようとすれば、これを行うのはそれほど難しくありません。PL/1 はかなり大きな言語と見なされており、言語委員会は、多くのプログラマーがそのすべてを学習するわけではなく、知らない部分のキーワードを識別子として使用しようとすると驚かれるのではないかと心配していました。 . したがって、次のように書くことができます。

IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF

他の人がここで指摘しているように、これを行う機能は推奨されません。

Java の設計者は、この言語のキーワードの数は控えめであると判断し、そのセットを予約しました。実際の Java プログラムでは実際には許可されていない「GOTO」も予約されています。

于 2009-11-08T21:02:49.440 に答える
2

javacコンパイラで予約語を使用する方法はありません。

技術的には、クラス ファイル内の名前を編集して、必要な名前に変更できます。この段階では、VM はソース コードを処理していないため、気にしません。一部の難読化者はこの手法を使用していると思います。

于 2009-01-08T16:37:49.100 に答える