简体   繁体   English

使用对象实例而不是类的 Java 注释反射

[英]Java annotation reflection with object instance instead of class

I am trying to check the hibernate annotation Column :我正在尝试检查休眠注释列:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Column {
...
} 

Getting the class using the object doesn't work using this code使用此代码无法使用对象获取类

Object o = an object ...
Class oClass = o.getClass();

for (Annotation a : oClass.getDeclaredAnnotations() ) {
   System.out.println ("\t * Annotation : " + a.annotationType().getSimpleName());
}

for(Method method : oClass.getMethods()){
   System.out.println(" method =>" + method.getName());
   for (Annotation a : method.getAnnotations()) {
       System.out.println("\t * Annotation : " + a.annotationType().getSimpleName());
   }
}

If I use directly the class MyObject.class instead of myInstance.getClass() it works, I don't understand why, the retention is RUNTIME so it should work ?如果我直接使用类 MyObject.class 而不是 myInstance.getClass() 它可以工作,我不明白为什么,保留是 RUNTIME 所以它应该可以工作? What am I missing ?我错过了什么?

here is the class, ps I removed the fields declaration这是课程,ps我删除了字段声明

@Entity
@Table(name="ticket"
)
public class Ticket  implements java.io.Serializable {


    public Ticket() {
    }

    public Ticket(Integer id, ... same for all fields) {
       this.id = id; 
       ... same for all fields
    }
   
    @Id @GeneratedValue(strategy=IDENTITY)

    @Column(name="id", unique=true, nullable=false)
    public Integer getId() {
        return this.id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="created_by")
    public User getUserByCreatedBy() {
        return this.userByCreatedBy;
    }
    
    public void setUserByCreatedBy(User userByCreatedBy) {
        this.userByCreatedBy = userByCreatedBy;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="event_id")
    public Event getEvent() {
        return this.event;
    }
    
    public void setEvent(Event event) {
        this.event = event;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="work_user")
    public User getUserByWorkUser() {
        return this.userByWorkUser;
    }
    
    public void setUserByWorkUser(User userByWorkUser) {
        this.userByWorkUser = userByWorkUser;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="assigned_to")
    public User getUserByAssignedTo() {
        return this.userByAssignedTo;
    }
    
    public void setUserByAssignedTo(User userByAssignedTo) {
        this.userByAssignedTo = userByAssignedTo;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="associated_ticket")
    public Ticket getTicket() {
        return this.ticket;
    }
    
    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="work_organization")
    public Organization getOrganizationByWorkOrganization() {
        return this.organizationByWorkOrganization;
    }
    
    public void setOrganizationByWorkOrganization(Organization organizationByWorkOrganization) {
        this.organizationByWorkOrganization = organizationByWorkOrganization;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="category")
    public OrganizationReference getOrganizationReference() {
        return this.organizationReference;
    }
    
    public void setOrganizationReference(OrganizationReference organizationReference) {
        this.organizationReference = organizationReference;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="power_station_id")
    public PowerStation getPowerStation() {
        return this.powerStation;
    }
    
    public void setPowerStation(PowerStation powerStation) {
        this.powerStation = powerStation;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="organization_id")
    public Organization getOrganizationByOrganizationId() {
        return this.organizationByOrganizationId;
    }
    
    public void setOrganizationByOrganizationId(Organization organizationByOrganizationId) {
        this.organizationByOrganizationId = organizationByOrganizationId;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="contract_id")
    public ServiceContract getServiceContract() {
        return this.serviceContract;
    }
    
    public void setServiceContract(ServiceContract serviceContract) {
        this.serviceContract = serviceContract;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="default_instance_id")
    public DefaultInstance getDefaultInstance() {
        return this.defaultInstance;
    }
    
    public void setDefaultInstance(DefaultInstance defaultInstance) {
        this.defaultInstance = defaultInstance;
    }

    
    @Column(name="type")
    public Integer getType() {
        return this.type;
    }
    
    public void setType(Integer type) {
        this.type = type;
    }

    
    @Column(name="workflow_id")
    public Integer getWorkflowId() {
        return this.workflowId;
    }
    
    public void setWorkflowId(Integer workflowId) {
        this.workflowId = workflowId;
    }

    
    @Column(name="ticket_number")
    public Integer getTicketNumber() {
        return this.ticketNumber;
    }
    
    public void setTicketNumber(Integer ticketNumber) {
        this.ticketNumber = ticketNumber;
    }

    
    @Column(name="status")
    public Integer getStatus() {
        return this.status;
    }
    
    public void setStatus(Integer status) {
        this.status = status;
    }

    
    @Column(name="severity")
    public Integer getSeverity() {
        return this.severity;
    }
    
    public void setSeverity(Integer severity) {
        this.severity = severity;
    }

    
    @Column(name="priority")
    public Integer getPriority() {
        return this.priority;
    }
    
    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    
    @Column(name="title", length=150)
    public String getTitle() {
        return this.title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }

    
    @Column(name="details", length=65535)
    public String getDetails() {
        return this.details;
    }
    
    public void setDetails(String details) {
        this.details = details;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="created_date", length=19)
    public Date getCreatedDate() {
        return this.createdDate;
    }
    
    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="update_date", length=19)
    public Date getUpdateDate() {
        return this.updateDate;
    }
    
    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    
    @Column(name="assigned_type", length=45)
    public String getAssignedType() {
        return this.assignedType;
    }
    
    public void setAssignedType(String assignedType) {
        this.assignedType = assignedType;
    }

    
    @Column(name="spent_hours", precision=22, scale=0)
    public Double getSpentHours() {
        return this.spentHours;
    }
    
    public void setSpentHours(Double spentHours) {
        this.spentHours = spentHours;
    }

    
    @Column(name="cost", precision=22, scale=0)
    public Double getCost() {
        return this.cost;
    }
    
    public void setCost(Double cost) {
        this.cost = cost;
    }

    
    @Column(name="currency", length=3)
    public String getCurrency() {
        return this.currency;
    }
    
    public void setCurrency(String currency) {
        this.currency = currency;
    }

    
    @Column(name="ticket_quote_status")
    public Integer getTicketQuoteStatus() {
        return this.ticketQuoteStatus;
    }
    
    public void setTicketQuoteStatus(Integer ticketQuoteStatus) {
        this.ticketQuoteStatus = ticketQuoteStatus;
    }

    
    @Column(name="ticket_account_status")
    public Integer getTicketAccountStatus() {
        return this.ticketAccountStatus;
    }
    
    public void setTicketAccountStatus(Integer ticketAccountStatus) {
        this.ticketAccountStatus = ticketAccountStatus;
    }

    
    @Column(name="maintainer_invoice_ref", length=64)
    public String getMaintainerInvoiceRef() {
        return this.maintainerInvoiceRef;
    }
    
    public void setMaintainerInvoiceRef(String maintainerInvoiceRef) {
        this.maintainerInvoiceRef = maintainerInvoiceRef;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="work_term_date", length=19)
    public Date getWorkTermDate() {
        return this.workTermDate;
    }
    
    public void setWorkTermDate(Date workTermDate) {
        this.workTermDate = workTermDate;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="work_start_date", length=19)
    public Date getWorkStartDate() {
        return this.workStartDate;
    }
    
    public void setWorkStartDate(Date workStartDate) {
        this.workStartDate = workStartDate;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="work_end_date", length=19)
    public Date getWorkEndDate() {
        return this.workEndDate;
    }
    
    public void setWorkEndDate(Date workEndDate) {
        this.workEndDate = workEndDate;
    }

    
    @Column(name="solved")
    public Boolean getSolved() {
        return this.solved;
    }
    
    public void setSolved(Boolean solved) {
        this.solved = solved;
    }

    
    @Column(name="resolution", length=65535)
    public String getResolution() {
        return this.resolution;
    }
    
    public void setResolution(String resolution) {
        this.resolution = resolution;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<TicketHistory> getTicketHistories() {
        return this.ticketHistories;
    }
    
    public void setTicketHistories(Set<TicketHistory> ticketHistories) {
        this.ticketHistories = ticketHistories;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<DeviceTransmissionHasDefectDetection> getDeviceTransmissionHasDefectDetections() {
        return this.deviceTransmissionHasDefectDetections;
    }
    
    public void setDeviceTransmissionHasDefectDetections(Set<DeviceTransmissionHasDefectDetection> deviceTransmissionHasDefectDetections) {
        this.deviceTransmissionHasDefectDetections = deviceTransmissionHasDefectDetections;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<StockUsage> getStockUsages() {
        return this.stockUsages;
    }
    
    public void setStockUsages(Set<StockUsage> stockUsages) {
        this.stockUsages = stockUsages;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<TicketComment> getTicketComments() {
        return this.ticketComments;
    }
    
    public void setTicketComments(Set<TicketComment> ticketComments) {
        this.ticketComments = ticketComments;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<TicketProperty> getTicketProperties() {
        return this.ticketProperties;
    }
    
    public void setTicketProperties(Set<TicketProperty> ticketProperties) {
        this.ticketProperties = ticketProperties;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<Notification> getNotifications() {
        return this.notifications;
    }
    
    public void setNotifications(Set<Notification> notifications) {
        this.notifications = notifications;
    }

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="ticket_has_tag", joinColumns = {
            @JoinColumn(name="ticket_id", nullable=false, updatable=false) }, inverseJoinColumns = {
            @JoinColumn(name="tag_id", nullable=false, updatable=false) })
    public Set<Tag> getTags() {
        return this.tags;
    }

    public void setTags(Set<Tag> tags) {
        this.tags = tags;
    }

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="ticket_has_ticket_tag", joinColumns = {
            @JoinColumn(name="ticket_id", nullable=false, updatable=false) }, inverseJoinColumns = {
            @JoinColumn(name="tag_id", nullable=false, updatable=false) })
    public Set<Tag> getTags_1() {
        return this.tags_1;
    }

    public void setTags_1(Set<Tag> tags_1) {
        this.tags_1 = tags_1;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<TicketHasEscalation> getTicketHasEscalations() {
        return this.ticketHasEscalations;
    }
    
    public void setTicketHasEscalations(Set<TicketHasEscalation> ticketHasEscalations) {
        this.ticketHasEscalations = ticketHasEscalations;
    }

@ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="ticket_has_document", joinColumns = { 
        @JoinColumn(name="ticket_id", nullable=false, updatable=false) }, inverseJoinColumns = { 
        @JoinColumn(name="document_id", nullable=false, updatable=false) })
    public Set<Document> getDocuments() {
        return this.documents;
    }
    
    public void setDocuments(Set<Document> documents) {
        this.documents = documents;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<CheckList> getCheckLists() {
        return this.checkLists;
    }
    
    public void setCheckLists(Set<CheckList> checkLists) {
        this.checkLists = checkLists;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<Ticket> getTickets() {
        return this.tickets;
    }
    
    public void setTickets(Set<Ticket> tickets) {
        this.tickets = tickets;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<Task> getTasks() {
        return this.tasks;
    }
    
    public void setTasks(Set<Task> tasks) {
        this.tasks = tasks;
    }

    @OneToMany(fetch=FetchType.LAZY, mappedBy="ticket")
    public Set<DownTime> getDownTimes() {
        return this.downTimes;
    }

    public void setDownTimes(Set<DownTime> downTimes) {
        this.downTimes = downTimes;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="scheduled_date", length=19)
    public Date getScheduledDate() {
        return this.scheduledDate;
    }

    public void setScheduledDate(Date scheduledDate) {
        this.scheduledDate = scheduledDate;
    }
}

edit 1 : Ok so I found something strange, if I load my object using org.hibernate.Session.load() method编辑 1 :好的,所以我发现了一些奇怪的东西,如果我使用 org.hibernate.Session.load() 方法加载我的对象

Integer anId = 1;
Ticket ticket = (Ticket)session.load(Ticket.class,anId); 

Loading the object this way and using reflection miss annotations, but if I try to invoke a new Object using以这种方式加载对象并使用反射未命中注释,但是如果我尝试使用调用新对象

Ticket ticket = new Ticket();

works ...作品...

In short :简而言之 :

Class oClass = session.load(Ticket.class,anId).getClass();

miss annotation with reflection but错过带有反射的注释但是

Class oClass = new Ticket().getClass();

works作品

edit 2 :编辑2:

thx dan1st, hibernate generate a subclass of Ticket when calling the method session.load thx dan1st, hibernate 在调用 session.load 方法时会生成一个 Ticket 的子类

edit 3 :编辑3:

so in my case I need to get the super class所以就我而言,我需要获得超级课程

Class oClass = session.load(Ticket.class,anId).getClass().getSuperclass()

Have you checked object what type of class it is returning 'session.load(Ticket.class,anId)' method?您是否检查过对象返回“session.load(Ticket.class,anId)”方法的类的类型? Most of the framework return proxy class for dynamic functionality.大多数框架都为动态功能返回代理类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM