packagetest;importtest.annotation.FieldInfo;importtest.annotation.MethodInfo;importtest.annotation.Silent;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.Arrays;importjava.util.Objects;classTestObj{@MethodInfo(id="method1",author="KrLite",date="2018-01-01",comment="Yet another method")publicvoidmethod1(){System.out.println("Invoked!");}@MethodInfo(id="method2",name="Foo",date="2077-07-07")privatevoidmethod2(){System.out.println("Invoked!");}public@SilentStringmethod3(){return"Silent!";}@Silent@MethodInfo(id="method3",date="null")publicvoidmethod4(){System.out.println("Should not be invoked.");}@FieldInfo(id="field1")publicStringfield1;@FieldInfo(id="field2",name="A Private Final Field")privatefinalStringfield2="This is a string.";publicfinal@SilentStringfield3="A special field that should not be printed.";}publicclassTest{publicstaticvoidmain(String[]args){TestObjtestObj=newTestObj();Class<?>testObjClass=testObj.getClass();Method[]methods=testObjClass.getDeclaredMethods();Arrays.stream(methods).forEach(Test::iteratorAnnotations);Field[]fields=testObjClass.getDeclaredFields();Arrays.stream(fields).forEach(Test::iteratorAnnotations);}publicstaticvoiditeratorAnnotations(Methodmethod){if(method.isAnnotationPresent(Silent.class)||method.getReturnType().isAnnotationPresent(Silent.class)){System.out.println("::silent method::\n");return;}if(method.isAnnotationPresent(MethodInfo.class)){MethodInfomethodInfo=method.getAnnotation(MethodInfo.class);printTitle(methodInfo.id(),methodInfo.name());try{method.setAccessible(true);method.invoke(method.getDeclaringClass().getDeclaredConstructor().newInstance());}catch(Exceptione){thrownewRuntimeException(e);}System.out.println("<author>: "+methodInfo.author());System.out.println("<date>: "+methodInfo.date());System.out.println("<revision>: "+methodInfo.revision());if(!Objects.equals(methodInfo.comment(),"")){System.out.println("<comment>: "+methodInfo.comment());}System.out.println();}}publicstaticvoiditeratorAnnotations(Fieldfield){if(field.isAnnotationPresent(Silent.class)){System.out.println("::silent field::\n");return;}if(field.isAnnotationPresent(FieldInfo.class)){FieldInfofieldInfo=field.getAnnotation(FieldInfo.class);printTitle(fieldInfo.id(),fieldInfo.name());try{field.setAccessible(true);System.out.println(field.get(field.getDeclaringClass().getDeclaredConstructor().newInstance()));}catch(Exceptione){thrownewRuntimeException(e);}System.out.println();}}privatestaticvoidprintTitle(Stringid,Stringname){System.out.println("<"+id+">"+(Objects.equals(name,"")?"":": "+name));}}