Junior — Middle
Kuidas käsitsi luua klassi eksemplar annotatsioonidega töötamiseks, ilma automaatse initsialiseerimiseta?
sobes.tech AI
Vastus AI-lt
Java-s kasutatakse tavaliselt refleksiooni mehhanismi, mis võimaldab saada annotatsioonide eksemplare, mis on rakendatud klassidele, meetoditele või väljadele. Kuid kui on vaja käsitsi luua annotatsiooni eksemplar (näiteks testimiseks), saab seda teha dünaamilise proxy abil.
Java annotatsioonid on liidesed, seega saab luua dünaamilise proxy, mis rakendab vajaliku annotatsiooni liidest ning määrab meetodite (annotatsiooni elementide) käitumise.
Näide, kuidas käsitsi luua annotatsiooni eksemplar:
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// Annotatsiooni näide
@interface MyAnnotation {
String value();
}
public class AnnotationManualInstance {
public static void main(String[] args) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
if (method.getName().equals("value")) {
return "Näide";
}
if (method.getName().equals("annotationType")) {
return MyAnnotation.class;
}
return null;
}
};
MyAnnotation annotation = (MyAnnotation) Proxy.newProxyInstance(
MyAnnotation.class.getClassLoader(),
new Class[]{MyAnnotation.class},
handler);
System.out.println(annotation.value()); // Väljund: Näide
}
}
Seega luuakse käsitsi proxy-objekt, mis rakendab annotatsiooni liidest ning tagastab määratud elementide väärtused.