Кратки съвети за java

Тук може да намерите полезни съвети и примери за много ситуации.

 

Определяне на мястото, откъдето е зареден даден клас

Докато разработваме Java приложения, включващи много външни библиотеки и jar файлове, понякога се случва даден клас да не се държи според очакваното. Тогава е важно да се знае от къде е зареден то клас, за да може да се определи точната му версия. Например, за да се определи файла, от който е зареден класа StrangeClass, просто трябва да се използва следния израз, оценен в съответната среда за изпълнение:

URL location = StrangeClass.class.getProtectionDomain().getCodeSource().getLocation();

Генериране на serialVersionUID чрез използване на serialver


За генериране на serialVersionUID на Serializablе класовете може да се използва serialver инструмента от стандартната JDK дистрибуция. За целта е нужно да имате компилирания клас в jar файл или подходяща директорийна структура по пакети. Ето два примера

1. Класът org.example.MySerializable е компилиран в директорията project\bin\org\example\Myserializable.class. В такъв случай използваме следната команда

X:\JDK\bin\serialver -classpath project\bin org.example.MySerializable


2. Класът org.example.MySerializable се намира в jar файла project/lib/myjar.jar. Тогава:

/path/to/JDK/bin/serialver -classpath project/lib/myjar.jar org.example.MySerializable

И в двата случая добавяме генерираното число към класа и прекомпилираме:

private static final long serialVersionUID = 1234572295622776147L;

Динамично прилагане на instanceOf() в Java

Обикновено при проверка дали даден обект е от даден клас, се използва подобна конструкция:

...
if (myObject instanceof MyClass) {
...

Но в случай, че класът се определя динамично по време на изпълнение, този код не е коректен - не може да се използва нещо подобно:

...
Class<?> myClass = Class.forName("MyClass");
if (myObject instanceof myClass) {
...

Правилния начин е:

...
Class<?> myClass = Class.forName("MyClass");
if (myClass.isInstance(myObject)) {
...


Проверка за съществуване на таблица в база данни чрез JDBC

Функцията по-долу проверява дали дадена таблица съществува в базата данни, асоциирана с JDBC връзката. Използвани са само JDBC операции, без използване на таблици, заявки или функции, специфични за определена база данни, за да се постигне по-висока съвместимост.

public boolean isTablePresent(Connection connection, String tableNameToFind) throws SQLException {
    DatabaseMetaData dbm = connection.getMetaData();
    ResultSet rs = dbm.getTables(null, null, null, null);
    boolean result = false;
    while (rs.next()) {
        String tableName = rs.getString(3);
        if (tableNameToFind.equalsIgnoreCase(tableName)) {
            result = true;
            break;
        }
    }
    rs.close();
    return result;
}


Откриване на даден Java class в директория с jar файлове


Ако имате директория с много jar фаилове и искате бързо да намерите този, който съдържа даден клас, ползвайте този скрипт:

findjar.sh:

dir=$1
class=$2
if [ $# -ne 2 ]
then
  echo "Usage: `basename $0` <directory> <class>"
  exit 1
fi

for file in `find $dir -name *.jar`
do
unzip -t $file | grep $class && echo $file
done

Пример: намиране на jar файл, който съдържа класа MyClass, в директорията /my/jars/folder:

findjar.sh /my/jars/folder MyClass