代码里都经常看到@override这样的形式的注解,于是自己就想写一个。
所谓注解,就是一个特殊的接口
格式如下
@Target(ElementType.TYPE)#作用目标,如在类、方法、参数是使用
@Retention(RetentionPolicy.RUNTIME)#作用时间,运行期间还是编译期间
public @interface testannotion {#注解的申明
String name();#方法
int id();#方法
}
以上,就是一个简单的注解
注解完成后就可以使用
@testannotion(id=4,name="王五")
public class hello {
private int id;
private String name;
public hello(int id,String name){
this.id = id;
this.name = name;
System.out.println("id:"+id+" name:"+name);
}
}
上面函数的目标就是通过注解的方式,将id,name赋值到类中的变量里去。
所以还需要创建一个注解解释器,主要通过反射的方式实现
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class explainAnnotion {
private Class cls;
public explainAnnotion(Class cls){
this.cls = cls;
}
public void explain() throws InstantiationException, IllegalAccessException, InvocationTargetException {
boolean hasAnnotation = cls.isAnnotationPresent(testannotion.class);
if ( hasAnnotation ) {
testannotion ta = (testannotion) cls.getAnnotation(testannotion.class);
int id = ta.id();
String name = ta.name();
System.out.println(name);
try {
Constructor defaultConstructor = cls.getDeclaredConstructor(int.class,String.class);
System.out.println("通过class.getDeclaredConstructor()获取默认构造函数:" + defaultConstructor + "\n");
hello ho = (hello)defaultConstructor.newInstance(id,name);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
最后执行
import java.lang.reflect.InvocationTargetException;
public class runannotion {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, InvocationTargetException{
explainAnnotion ex = new explainAnnotion(hello.class);
ex.explain();
}
}