Java custom annotations and instances of reading annotations using reflection
- 2020-09-16 07:27:19
- OfStack
1. Custom annotations
Yuan comments:
@ES5en annotation: Define the annotation interface
@ES8en annotation: Used to restrict the scope of use of the described annotation. Compilation fails when the described annotation exceeds the scope of use. Such as: ElementType METHOD, ElementType. TYPE;
@ES15en annotation: Used to constrain the scope of a defined annotation. There are three scopes of scope:
1, RetentionPolicy.SOURCE: Scope is the source code, applied to the Java file, when javac is executed to remove the annotation.
2. RetentionPolicy. CLASS: The scope is base 2 code, which exists in the class file. When Java is executed, the annotation is removed.
3. RetentionPolicy. RUNTIME: The scope is runtime, which means we can get the comment dynamically.
Documented: Used to specify that javadoc generates the API document to display this comment.
Inherited: Used to specify that a described comment can be inherited by a subclass of the class it describes. By default, it cannot be inherited by a subclass.
Custom annotation interface:
package com.java.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation_my {
String name() default " zhang 3";//defalt Represents the default value
String say() default "hello world";
int age() default 21;
}
Next, we define an interface:
package com.java.annotation;
@Annotation_my // Use the annotations that we just defined
public interface Person {
@Annotation_my
public void name();
@Annotation_my
public void say();
@Annotation_my
public void age();
}
With the interface defined, we can write the implementation class of the interface (the interface cannot be instantiated)
package com.java.annotation;
@Annotation_my
@SuppressWarnings("unused")
public class Student implements Person {
private String name;
@Override
@Annotation_my(name=" Rogue childe ") // Assigned to name The default is zhang 3
// If no default value is given when defining an annotation, it is required here name initialise
public void name() {
}
@Override
@Annotation_my(say=" hello world ! ")
public void say() {
}
@Override
@Annotation_my(age=20)
public void age() {
}
}
Then we write a test class to test our annotations
package com.java.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Text {
Annotation[] annotation = null;
public static void main(String[] args) throws ClassNotFoundException {
new Text().getAnnotation();
}
public void getAnnotation() throws ClassNotFoundException{
Class<?> stu = Class.forName("com.java.annotation.Student");// Statically loaded class
boolean isEmpty = stu.isAnnotationPresent(com.java.annotation.Annotation_my.class);// judge stu Is the annotation interface we just defined used if(isEmpty){
annotation = stu.getAnnotations();// Gets in the annotation interface
for(Annotation a:annotation){
Annotation_my my = (Annotation_my)a;// Cast into Annotation_my type
System.out.println(stu+":\n"+my.name()+" say: "+my.say()+" my age: "+my.age());
}
}
Method[] method = stu.getMethods();//
System.out.println("Method");
for(Method m:method){
boolean ismEmpty = m.isAnnotationPresent(com.java.annotation.Annotation_my.class);
if(ismEmpty){
Annotation[] aa = m.getAnnotations();
for(Annotation a:aa){
Annotation_my an = (Annotation_my)a;
System.out.println(m+":\n"+an.name()+" say: "+an.say()+" my age: "+an.age());
}
}
}
//get Fields by force
System.out.println("get Fileds by force !");
Field[] field = stu.getDeclaredFields();
for(Field f:field){
f.setAccessible(true);
System.out.println(f.getName());
}
System.out.println("get methods in interfaces !");
Class<?> interfaces[] = stu.getInterfaces();
for(Class<?> c:interfaces){
Method[] imethod = c.getMethods();
for(Method m:imethod){
System.out.println(m.getName());
}
}
}
}