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

先是自己定义注解,比如我定义的注解有两个,一个是@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

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



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