SpringMVC 自己写注解,理解注解

    xiaoxiao2021-03-25  86

    前几天看到注解这块,反正也没事,就当成自己学习,慢慢写注解,从底层写起,我也是个小吧,不足的地方强大家谅解

    先是自己定义注解,比如我定义的注解有两个,一个是@longin,一个是@qw,代码如下

    @Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME) @Target(value={java.lang.annotation.ElementType.METHOD}) public @interface longin { //使用时候是@login String value() default "没改变value"; String hh() default "没改变hh"; } @Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME) @Target(value={java.lang.annotation.ElementType.METHOD}) @interface qw { //使用时候是@qw String value() default "loginaction"; String hh() default "COM.fanpeng.zhujie.ffs";

    这样,我们就定义了两个注解,现在我们需要解析注解的能容,让方法去认识和使用注解,方法如下:

    import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class getzhujie { public static void main(String[] args) throws SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException { getxxx("COM.fanpeng.zhujie.ffs"); //字符串为使用注解的类的全类名 } public static Object getObject(String classfullname) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ return Class.forName(classfullname).newInstance(); //先让全类名反射,等到object类型 } // public static Method[] getmethod(String classfullname) throws SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException{ // return getObject(classfullname).getClass().getDeclaredMethods(); // } public static Method[] getmethod(Object obj) throws SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException{ return obj.getClass().getDeclaredMethods(); //然后得到这个类的所有方法的集合 } public static void getxxx(String classfullname) throws SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException{ Object object = getObject(classfullname); //先让全类名反射,等到object类型 Method[] methods = getmethod(object); //然后得到这个类的所有方法的集合 for (Method method : methods) { //遍历这个方法 Annotation[] annotations = method.getAnnotations(); //得到每个方法的注解集合 for (Annotation annotation : annotations) { //遍历注解 if (annotation instanceof qw) { //判断注解的名称是否与我们自己写的注解名称相同 qw lo=(qw) annotation; //如果相同,将注解强转成我们写的注解的类型 String str=lo.value(); //得到我们注解里面定义的value String hh=lo.hh(); //得到我们注解里面定义的hh method.invoke(object,new Object[]{str,hh}); //然后注入,让不同的注解去执行不同的方法 } } } }

    这样我们的注解解析就做完了,现在我们用一个例子来看:

    public class ffs { //这就是使用的类,上面那个字符串的全类名就是这个 @qw(value="login.action", hh="123") //我们可以给注解自定义值,这是注解里面的value和hh值就变成我们自定义的了 public void makeFefs(String str1, String str2){ System.out.println(str1+str2); } @qw //如果不自定义值,注解的值就是我们在最前边定义的那个值 public void makeFehfs(String str1, String str2){ System.out.println("str1+str2"); } @login //如果不自定义值,注解的值就是我们在最前边定义的那个值 public void makeFehfs(){ System.out.println("方法也可以不传值"); }

    执行第二个类,我们就可以得到下面的结果:

    login.action123 方法也可以不传值 str1+str2

    上面的文章可以向我们展示,注解的值可以用到,也可以不用的,注解是方法的一部分

    小白一个,错的地方请大家指出,第一次发博客,格式什么的也不懂

    转载请注明原文地址: https://ju.6miu.com/read-22752.html

    最新回复(0)