Подтвердить что ты не робот

Какой тип Java "[B"?

Я пытаюсь получить зашифрованный MD5-проход из базы данных MySQL через Java-код (Hibernate). Но я не могу получить ни String, ни какой-либо разумный тип Java.

Единственное, что я получаю, это бесполезное сообщение: java.lang.ClassCastException: [B не может быть добавлено в com.mysql.jdbc.Blob (или какой-либо тип Java, к которому я пытаюсь применить).

Вот мой метод:

public void testCrypto() {
        session.beginTransaction();
        // creates native SQL query
        // uses native MySQL 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)
4b9b3361

Ответ 1

Что мой друг - это массив байтов. В JNI [B используется для описания массива ([) байтов (B). Массив ints имеет значение [I и т.д.

Вы можете получить дополнительную информацию о дескрипторах полей здесь:
http://java.sun.com/docs/books/jni/html/types.html (раздел 12.3.3 должен быть тем, что вы ищете).

Ответ 2

Это имя класса byte[].class. Попробуйте следующее:

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

Выход (вы уже догадались):

И если вы хотите получить доступ к читаемому имени, используйте Class.getCanonicalName():

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

Вывод:

байт []

Ответ 3

Как утверждают другие ответы, это байтовый массив.

Если вы хотите получить строку из массива байтов, используйте конструктор String:

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

Ответ 4

[B - это имя закодированного типа для байтового массива (byte []), которое обычно должно появляться только в строках подписи типа, так как оно не является допустимым именем типа.