2011-01-06 13 views
2

コンパニオンクラスを持たないシングルトンオブジェクトMainを作成すると、そのシングルトンのクラスを取得する方法はありますか? classOf[Main]は、 "not found:type Main"というエラーを出します。ScalaでMainクラスを取得する

+0

同じ名前のクラスのコンパニオンオブジェクトの一部であるメインメソッドを使用してプログラムを開始するには、そのメソッドを使用したい場合は、機能しません。 Scalaは、どのような理由でも、コンパニオンではないオブジェクトに対するmainメソッドの特別な処理しかありません。 – Madoc

+0

@マドック:私はそれが2.8.0で修正されたと思った。いずれにせよ、私はまだコンパニオンのない 'Main'オブジェクトを作成します。通常は 'main'メソッドしかありません。 – Ralph

答えて

3

それはクラスのインスタンスだとして、あなたはこの1つをやってのけるする方法Main.getClassを使用することができます。

JVMは背景のなかでMain$という名前のクラスのインスタンスであることを知り、必要に応じてJavaのリフレクションメソッドを使用してアクセスできます。

これまで述べてきたように、とにかくScalaでのリフレクションはほとんど必要ありません。なぜなら、面白いビットの理論の直後でなければ、本当に必要ないはずです。

+0

ユースケース: 'val buildNumber = try {新しいManifest(新しいURL( "jar:" + classOf [main] .getProtectionDomain.getCodeSource.getLocation + "!/META-INF/MANIFEST.MF")。openStream).getMainAttributes.getValue( "ビルド番号")} catch {case _:ZipException => "0"} ' – Ralph

+0

ありがとうございました。ソリューションが機能しました。 – Ralph

0

シングルトンオブジェクト(別名モジュール)は、継承できない "クラス"を持っていません。シングルトンとクラスを反対の概念と考える。

彼らはしかし種類があります:

object Main 

def test(a: Main.type): Unit = println("Got: " + a) 

test(Main) 
+0

「クラス」と「タイプ」の違いは何ですか? –

+0

まあ、私が言ったように、モジュールはあなたがそれから継承することができるクラスではありません。したがって、Mainはクラスよりもむしろ値(インスタンス)です。 Main.typeは値の「シングルトン型」を提供します。 http://blogs.sun.com/sundararajan/entry/mis_understaning_scala_s_singleton –

関連する問題