2015-05-19 20 views
5

Tôi đang gặp sự cố với sự phản ánh. Tôi đã quyết định tạo một Trình tạo truy vấn SQL bằng cách sử dụng sự phản chiếu. Tôi đã tạo chú thích của riêng mình để xác định những lớp nào có thể được sử dụng, những thuộc tính nào có thể được lưu trữ ect. Mã hoạt động như tôi muốn, tuy nhiên vấn đề này có nghĩa là sử dụng dự án này như là sự phụ thuộc vào các dự án khác.Mất phản ánh thông tin chú thích Java

Tôi có một dự án khác sử dụng OJDBC và tôi đang cố gắng sử dụng thư viện của mình để tạo các Truy vấn dựa trên lớp. Tuy nhiên khi tôi vượt qua một lớp từ dự án ojdbc của tôi có một sự mất mát của tất cả các thông tin lớp, lớp xuất hiện như java.lang.Class và thậm chí cả thông tin chú thích bị mất. Có ai biết tại sao điều này xảy ra không?

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

Các cls.getAnnotation(Storable.class) đang mất thông tin khi lớp sau đây được truyền cho nó

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

} 

Lớp động vật là trong dự án ojdbc và phương pháp appendTableName thuộc về người xây dựng truy vấn của tôi. Tôi đã thử tạo dự án querybuilder vào một jar và sử dụng maven install để thêm nó vào kho lưu trữ của tôi và vẫn không có may mắn.

Cảm ơn bạn đã trả lời nhanh, tuy nhiên điều này không có vấn đề như Chú thích tôi đã tạo có Duy trì được đặt thành Thời gian chạy xem bên dưới.

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 ""; 
} 

Chú thích của tôi được đặt thành thời gian chạy nhưng thông tin lớp vẫn bị mất.

+0

Mã bạn đã đăng sẽ hoạt động. Đó là, nguyên nhân nằm ở nơi khác. Bạn có chắc chắn rằng đối tượng lớp được truyền tương ứng với một lớp với chú thích này không? (Và không, ví dụ, một số lớp con được tạo ra trong thời gian chạy?) Bạn có chắc là lớp đã được định nghĩa từ một nguồn có chú thích đó không? (Bạn hiện không chạy với phiên bản cũ của lớp chưa có chú thích, phải không?) – meriton

+0

Không, phiên bản của nó đang chạy với phiên bản đúng của chú thích và im không phụ thuộc vào lúc này. Lớp không ném lỗi biên dịch và tham chiếu chính xác chú thích. Chú thích được đóng gói trong một lọ đã được thêm vào dự án thông qua các phụ thuộc maven. –

+1

... và bạn chắc chắn lớp chú thích có sẵn trên đường dẫn lớp thời gian chạy không? (Bạn có thể xác minh điều này bằng cách kiểm tra rằng 'Class.forName (" com.whatever.Storable ")' không ném một ngoại lệ) – meriton

Trả lời

5

Khi bạn muốn chú thích có thể sử dụng được khi chạy, bạn cần thêm chú thích vào nó.

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

Nếu không, chú thích sẽ không hiển thị khi chạy.

Để biết thêm thông tin, đây là nguồn cho chú thích này.

/** 
* 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(); 
} 
+0

Xem mã tôi enetered dưới đây –

+0

Tôi không hoàn toàn chắc chắn những gì tôi đã đi sai như tôi đã thực hiện không có thay đổi mã và bây giờ nó có vẻ chạy tốt. Cảm ơn các đầu vào. –

Các vấn đề liên quan