反射に問題があります。リフレクションを使用して SQL クエリ ジェネレーターを作成することにしました。どのクラスを使用できるか、どの属性を保存できるかなどを判断するために、独自の注釈を作成しました。コードは思い通りに機能しますが、問題はこのプロジェクトを他のプロジェクトの依存関係として使用することにあります。
OJDBC を使用する別のプロジェクトがあり、ライブラリを使用してクラスに基づいてクエリを生成しようとしています。ただし、ojdbc プロジェクトからクラスを渡すと、すべてのクラス情報が失われ、クラスは java.lang.Class として表示され、注釈情報も失われます。なぜこれが起こっているのか誰にも分かりますか?
private static <T> void appendTableName(Class<T> cls) throws NotStorableException {
Storable storable = cls.getAnnotation(Storable.class);
String tableName = null;
if (storable != null) {
if ((tableName = storable.tableName()).isEmpty())
tableName = cls.getSimpleName();
} else {
throw new NotStorableException(
"The class you are trying to persist must declare the Storable annotaion");
}
createStatement.append(tableName.toUpperCase());
}
次のcls.getAnnotation(Storable.class)
クラスが渡されると、情報が失われます
package com.fdm.ojdbc;
import com.fdm.QueryBuilder.annotations.PrimaryKey;
import com.fdm.QueryBuilder.annotations.Storable;
@Storable(tableName="ANIMALS")
public class Animal {
@PrimaryKey
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
animal クラスは ojdbc プロジェクトにあり、appendTableName メソッドはクエリ ビルダーに属しています。querybuilder プロジェクトを jar に生成しようとしましたが、maven install を使用してそれをリポジトリに追加しましたが、まだ運がありません。
迅速な返信ありがとうございます。しかし、私が作成した注釈は保持がランタイムに設定されているため、これは問題ではありません。以下を参照してください。
package com.fdm.QueryBuilder.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = { ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Storable {
public String tableName() default "";
}
私の注釈はランタイムに設定されていますが、クラス情報はまだ失われています。