5

反射に問題があります。リフレクションを使用して 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 "";
}

私の注釈はランタイムに設定されていますが、クラス情報はまだ失われています。

4

1 に答える 1

5

実行時に使用できる注釈が必要な場合は、注釈を追加する必要があります。

@Retention(RetentionPolicy.RUNTIME)
public @interface Storable {

これがないと、注釈は実行時に表示されません。

詳細については、この注釈のソースをご覧ください。

/**
 * Indicates how long annotations with the annotated type are to
 * be retained.  If no Retention annotation is present on
 * an annotation type declaration, the retention policy defaults to
 * {@code RetentionPolicy.CLASS}.
 *
 * <p>A Retention meta-annotation has effect only if the
 * meta-annotated type is used directly for annotation.  It has no
 * effect if the meta-annotated type is used as a member type in
 * another annotation type.
 *
 * @author  Joshua Bloch
 * @since 1.5
 * @jls 9.6.3.2 @Retention
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
于 2015-05-19T16:33:56.053 に答える