30 Stimmen

Was für ein Java-Typ ist "[B"?

Ich versuche, MD5-verschlüsselte Pass von MySQL DB über Java-Code (Hibernate) zu erhalten. Aber ich kann weder String noch irgendeinen vernünftigen Java-Typ erhalten.

Das Einzige, was ich erhalte, ist diese wenig hilfreiche Meldung: java.lang.ClassCastException: [B kann nicht auf com.mysql.jdbc.Blob gecastet werden (oder was auch immer für ein Java-Typ ich versuche zu casten).

Hier ist meine Methode:

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();
}

Hier ist der vollständige Stack-Trace:

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)

59voto

rfeak Punkte 8008

Das, mein Freund, ist ein Array von Bytes. In JNI wird [B verwendet, um ein Array zu beschreiben ( [ ) von Bytes ( B ). Ein Array von Ints ist [I etc.

Weitere Informationen zu Feldbeschreibungen finden Sie hier:
JNI-Typen und Datenstrukturen ( Tabelle 3-2 sollte das sein, wonach Sie suchen).

9voto

Sean Patrick Floyd Punkte 283617

Es ist der Klassenname von byte[].class . Versuchen Sie dies:

System.out.println(byte[].class.getName());

Ausgabe (Sie haben es erraten):

[B

Und wenn Sie auf den lesbaren Namen zugreifen wollen, verwenden Sie Class.getCanonicalName() :

System.out.println(byte[].class.getCanonicalName());

Ausgabe:

byte[]

4voto

Evan Mulawski Punkte 53325

Wie die anderen Antworten zeigen, handelt es sich um ein Byte-Array.

Wenn Sie eine Zeichenkette aus einem Byte-Array erhalten möchten, verwenden Sie den String-Konstruktor:

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();
}

3voto

Chris Dodd Punkte 109402

[B ist der kodierte Typname für ein Byte-Array (byte[]), der normalerweise nur in Strings für Typsignaturen erscheinen sollte, da er kein gültiger Typname ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X