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.
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
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. –
... 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