直接上代码:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)//标识在代码运行期间进行应用
public @interface MyAnnotation {
String value();//保存变量名,参数名为value
}
定义一个自己的类使用自定义注解:
public class MyClass{
@MyAnnotation("username")
private String username;
}
运行测试:
public class Mian {
public static void main(String args[]) {
System.out.println("Hello World!");
MyClass myClass = new MyClass();
Field[] fields = myClass.getClass().getDeclaredFields();
for (Field field : fields){
if (field.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation alias = field.getAnnotation(MyAnnotation.class);
System.out.println(alias.value());
}
}
}
public static class MyClass{
@MyAnnotation("username")
private String username;
}
}
输出如下:
Hello World!
username
一个简单的注解完成了,接下来看看方法的注解应用:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MethodAnnotation {
String value();
int id();
}
public static class MyClass{
@MyAnnotation("username")
private String username;
@MethodAnnotation(value = "i am method annotation",id = 2)
private void myMethod(){
System.out.println("I am method body!!!");
}
}
测试如下:
Method[] methods = myClass.getClass().getDeclaredMethods();
for (Method method : methods){
if(method.isAnnotationPresent(MethodAnnotation.class)){
MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class);
System.out.println(methodAnnotation.value() + " id is " + methodAnnotation.id());
try {
if (Modifier.isStatic(method.getModifiers())) {
method.invoke(null); // static method
} else if (Modifier.isPrivate(method.getModifiers())) {
method.setAccessible(true); // private method
method.invoke(myClass);
} else {
method.invoke(myClass); // public method
}
method.invoke(myClass.getClass());
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果如下:
i am method annotation id is 2
I am method body!!!
注解在java中的应用特别广泛,Spring,Xutils等等框架,器原理如上,java官话把注解说成元数据,一种代码级别的说明。其实说白了就是代码的标记,我把这个变量或者这个方法通过注解进行标记区分,从而在代码运行期间通过反射去判断,如果有标记就做我们的自定义操作
网友评论