@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value();
}
@SupportedAnnotationTypes("com.example.Log")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class LogAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(Log.class)) {
String logMessage = element.getAnnotation(Log.class).value();
String logCode = String.format("System.out.println(\"Logging: %s\");", logMessage);
// ...
System.out.println(logCode);
}
return true;
}
}
public class MyClass {
@Log("Hello World")
public void doSomething() {
// ...
}
}
logger=com.example.MyLogger
Properties properties = new Properties();
properties.load(ClassLoader.getSystemResourceAsStream("klogger.properties"));
String loggerClass = properties.getProperty("logger");
MyLogger logger = (MyLogger)Class.forName(loggerClass).newInstance();
Klogger.setLogger(logger);