java注解

2017-05-10  本文已影响25人  camlboy

直接上代码:

@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官话把注解说成元数据,一种代码级别的说明。其实说白了就是代码的标记,我把这个变量或者这个方法通过注解进行标记区分,从而在代码运行期间通过反射去判断,如果有标记就做我们的自定义操作

上一篇下一篇

猜你喜欢

热点阅读