有没有在写代码的时候见过这样的东西@Override
很早的时候我一直以为是IDE提供的标示,后来才注意到这其实是Java提供的一种代码注释。本身对程序没有任何的影响,但是可以给予IDE和编译器更多的信息。
一个完整的注释可能是这样的
@Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass() { ... }
或许写成这样更熟悉一些
@Author(name = "Benjamin Franklin", date = "3/27/2003")
class MyClass() { ... }
这是包含两个属性的注释,包含一个属性的注释是这样的
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
对于只有一个属性,而且叫value
其实可以省略成这样@SuppressWarnings("unchecked")
现在是不是很熟悉了~~
写注释太简单不过了~~~ 只是语法比较特殊而已
//ClassPreamble.java
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
String[] reviewers();
}
这样,我们再写一个类的时候可以给它加这样的注释了
@ClassPreamble(author = "", date = "", reviewers = { "" })
public class MainActivity extends Activity {
...
}
经常见到的一些
还有一些注解是给注解添加注解的,比如
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation { }
这个注解的注解告诉了编译器,MethodAnnotation
这个注解只能作用于方法,并且在运行时的时候起作用。
好像还是没什么用处,对不对?有一个JSON的解析库叫gson,它有一个功能可以把一个JSON对象直接解析成一个Java的类,大概这样
//json数据
{
"name":"ntop",
"age":30
}
//.java
class Persion {
@SerializedName("name")
private String mName;
@SerializedName("age")
private int mAge;
}
//
Persion p = new Gson().from(jsonstring, Persion.class)
看上去是不是很神奇,其实这里面用到的就是注解的功能,可以自己写一个类似的函数,把json的字段映射到注解的名字
private Object parse(String jsonstring, Object obj) throws Exception {
JSONObject json = new JSONObject(jsonstring);
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
SerializedName serianame= field.getAnnotation(SerializedName.class);
if(serianame != null){
field.set(obj, json.opt(serianame.value()));
}
}
return obj;
}
Persion p = (Persion) parse("{\"name\":\"ntop\",\"age\":30}", new Persion() );
System.out.println("name:" + p.mName);
System.out.println("age:" + p.mAge);
内容来源:
nTop 22 January 2015