web-dev-qa-db-ja.com

「[B」はどのようなJavaタイプですか?

Javaコード(Hibernate)を介してMySQL DBからMD5暗号化パスを取得しようとしています。しかし、文字列も妥当なJavaタイプも取得できません。

私が得ている唯一のことは、この役に立たないメッセージです:Java.lang.ClassCastException:[Bはcom.mysql.jdbc.Blobにキャストできません(またはJavaキャストしてみるタイプ)。

これが私の方法です:

public void testCrypto() {
        session.beginTransaction();
        // creates native SQL query
        // uses native MySQL's MD5 crypto
        final Blob pass = (Blob) session.createSQLQuery("SELECT MD5('somePass')")
            .list().get(0);
        session.getTransaction().commit();
}

これが完全なスタックトレースです。

Java.lang.ClassCastException: [B cannot be cast to com.mysql.jdbc.Blob
    at domain.DatabaseTest.testCrypto(DatabaseTest.Java:57)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.Java:168)
    at junit.framework.TestCase.runBare(TestCase.Java:134)
    at junit.framework.TestResult$1.protect(TestResult.Java:110)
    at junit.framework.TestResult.runProtected(TestResult.Java:128)
    at junit.framework.TestResult.run(TestResult.Java:113)
    at junit.framework.TestCase.run(TestCase.Java:124)
    at junit.framework.TestSuite.runTest(TestSuite.Java:232)
    at junit.framework.TestSuite.run(TestSuite.Java:227)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.Java:83)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:49)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
25
Xorty

私の友達はバイトの配列です。 JNIでは、[Bは配列を記述するために使用されます([)バイト(B)。 intの配列は[Iなど。

ここでフィールド記述子に関するもう少し情報を得ることができます:
JNIタイプとデータ構造表3-2 はあなたが探しているものでなければなりません)。

50
rfeak

_byte[].class_のクラス名です。これを試して:

_System.out.println(byte[].class.getName());
_

出力(あなたはそれを推測しました):

[B

また、読み取り可能な名前にアクセスする場合は、 Class.getCanonicalName() を使用します。

_System.out.println(byte[].class.getCanonicalName());
_

出力:

バイト[]

8

他の回答が述べているように、それはバイト配列です。

バイト配列から文字列を取得する場合は、Stringコンストラクターを使用します。

public void testCrypto()
{
        session.beginTransaction();
        // creates native SQL query
        // uses native MySQL's MD5 crypto
        final String pass = new String(session.createSQLQuery("SELECT MD5('somePass')")
            .list().get(0));
        session.getTransaction().commit();
}
4
Evan Mulawski

[Bは、バイト配列(byte [])のエンコードされた型名です。これは、有効な型名ではないため、通常は型署名文字列にのみ表示されます。

3
Chris Dodd