@interface 这个是什么接口

xiangdefei 2010-05-05 11:37:08

@interface 这个是什么接口?
我试了一下,实现这种接口的子类必须重写这个方法:
@Override
public Class<? extends Annotation> annotationType() {

return null;
}
而且,在这种接口里不能定义返回void的方法。如:public void test();
哪位前辈给详细介绍一下。
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在 J2SE 中很少用,但在 Java EE 5 中大量地使用了。

使用 Annotation 的好处就是避免写一些与代码分离的 XML 配置文件。像上面例子中的 Order 我写了个 @Column,容器就可以分析出 Order 中的属性与数据表中的哪一个列可以对应起来。我们一看也能知道这个属性对应着数据表中的哪一个列。
  • 打赏
  • 举报
回复
好了,写了个测试的代码,写了些注释,应该能够看得懂了,呵呵

为了方便起见,我都写在一个 java 文件中了。

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Date;

public class AnnotationTest {

public static void main(String[] args) throws Exception {

// 通过内省获得 BeanInfo 对象,用于提取属性值
// 后面一个 Object.class 表示,当前继承链截止到 Object 为止,也就是说 Object 的属性不被提取
BeanInfo beanInfo = Introspector.getBeanInfo(Order.class, Object.class);

// 获取属性集
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

for(int i = 0; i < pds.length; i++) {

Column column = propertyParse(pds[i]);
System.out.println("property: " + pds[i].getName());

if(column == null) {
System.out.println(" has not been annotated @Column");
continue;
}

// 这里 Column 的两个方法,就是在 @interface Column 中定义的那两个
System.out.println(" @Column name = " + column.name());
System.out.println(" @Column index = " + column.index());
}
}

/**
* 提取属性中 get 或者 set 方法上标注的 @Column 信息
* @param pd
* @return
*/
private static Column propertyParse(PropertyDescriptor pd) {

// 获得属性的 get 方法
Method read = pd.getReadMethod();
// 看看 get 方法上是否标注了 @Column,优先采用 get 方法上的标注
if(read != null && read.isAnnotationPresent(Column.class)) {
return read.getAnnotation(Column.class);
}

// 获得属性的 set 方法
Method write = pd.getWriteMethod();
// 看看 set 方法上是否标注了 @Column
if(write != null && write.isAnnotationPresent(Column.class)) {
return write.getAnnotation(Column.class);
}

// 都没有标注的话返回 null
return null;
}

}

class Order {

private String orderId;
private Date orderTime;

@Column(name = "ORDER_ID")
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}

public Date getOrderTime() {
return orderTime;
}

@Column(name = "ORDER_TIME", index = 1)
public void setOrderTime(Date orderTime) {
this.orderTime = orderTime;
}
}

//表示运行时有效
@Retention(RetentionPolicy.RUNTIME)
// ElementType.METHOD 表示可以标注于方法上
// ElementType.FIELD 表示可以标注于成员变量上
// 这里的参数是数组,可以写多个
@Target({ ElementType.METHOD })
@interface Column {
String name(); // 没有 default 的话,标注时必须填值
int index() default 0; // 有 default 的话,标注时不填值时使用默认值
}
xiangdefei 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]
这样做是为了节省关键字 interface 与 @interface 是不同的,虽然看上去差不多,区别就相当于 Java 与 JavaScript 的区别,完全是不同的东西。
[/Quote]

前辈,介绍一下在java里这个玩意有什么作用?是拿来干嘛的?
xiangdefei 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
在 J2SE 中很少用,但在 Java EE 5 中大量地使用了。

使用 Annotation 的好处就是避免写一些与代码分离的 XML 配置文件。像上面例子中的 Order 我写了个 @Column,容器就可以分析出 Order 中的属性与数据表中的哪一个列可以对应起来。我们一看也能知道这个属性对应着数据表中的哪一个列。
[/Quote]


前辈,你举的这个例子像Hibernate提供的属性注解功能哦,把数据表里的字段注解到对象的属性方法上。。。!
xiangdefei 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bao110908 的回复:]
这个不是接口,这是定义一个 Annotation,呵呵
[/Quote]

麻烦这位前辈给详细介绍一下。
  • 打赏
  • 举报
回复
这样做是为了节省关键字 interface 与 @interface 是不同的,虽然看上去差不多,区别就相当于 Java 与 JavaScript 的区别,完全是不同的东西。
  • 打赏
  • 举报
回复
这个不是接口,这是定义一个 Annotation,呵呵

50,504

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧