Я добавил предопределенную аннотацию к методу во время выполнения. Я хочу, чтобы изменения были постоянными?
Итак, допустим, у меня есть класс Person, и я хочу добавить аннотацию Myntra к методу getLastName() во время выполнения (что я выполнил с помощью библиотеки Javassist)
Но я хочу, чтобы изменения были постоянными, чтобы при следующем запуске аннотация была там!!
Как я могу это сделать?
package com.flipkart.aditya.annotations;
public class Person {
private String firstName;
private String lastName;
private String adhaarID;
private int employeeID;
public Person(String firstName, String lastName, String adhaarID, int employeeID) {
this.firstName = firstName;
this.lastName = lastName;
this.adhaarID = adhaarID;
this.employeeID = employeeID;
}
@Myntra
@Jabong
public String getFullName()
{
return firstName+" "+lastName;
}
@Xyz
public String getFirstName()
{
return firstName;
}
public String getLastName() {
return lastName;
}
@Myntra
public String getAdhaarID() {
return adhaarID;
}
@Jabong
@Xyz
public int getEmployeeID() {
return employeeID;
}
}
Вот как я это сделал с помощью javassist lib
package com.flipkart.aditya.annotations;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.AnnotationsAttribute;
import javassist.bytecode.ClassFile;
import javassist.bytecode.ConstPool;
import javassist.bytecode.annotation.Annotation;
public class AddRunTimeAnnotation {
public static void addNewAnnotationToMethod(String className,String methodName) throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.getCtClass(className);
CtMethod ctMethod = cc.getDeclaredMethod(methodName);
ClassFile ccFile = cc.getClassFile();
ConstPool constpool = ccFile.getConstPool();
AnnotationsAttribute attr = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
Annotation annot = new Annotation("com.flipkart.aditya.annotations.Myntra", constpool);
attr.addAnnotation(annot);
ctMethod.getMethodInfo().addAttribute(attr);
Class<?> c =cc.toClass();
}
}
Это моя аннотация Myntra
package com.flipkart.aditya.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Myntra {
}
ПРИМЕЧАНИЕ: Jabong и xyz также являются аннотациями, похожими на Myntra, но не имеют ничего общего с моим вопросом.
Вот как выглядят мои функции main() -> Я здесь добавляю новую аннотацию Myntra к методу getLastName(), а затем распечатываю все методы, которые имеют аннотацию Myntra, используя отражение Java.
public class NewApplicationToTestApproachOne {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
try {
AddRunTimeAnnotation.addNewAnnotationToMethod("com.flipkart.aditya.annotations.Person", "getLastName");
} catch (Exception e) {
e.printStackTrace();
}
Person person = new Person("Ravan", "lanka wale", "0000 0000 0000", 420);
Class<?> reflectClass = Person.class;
Method[] arrayOfMethods = reflectClass.getDeclaredMethods();
for (Method method : arrayOfMethods) {
if (method.isAnnotationPresent(Myntra.class)) {
System.out.println(method.invoke(person, null));
}
}
}
}
Таким образом, он отлично работает во время выполнения -> ВЫХОД:
Ravan lanka wale
0000 0000 0000
lanka wale
Но я хочу, чтобы аннотация, добавленная к методу getLastName(), была постоянной и навсегда. Я не уверен, возможно это или нет? Если да -> расскажите, пожалуйста, как это сделать!!
1 ответ
Добавьте свою аннотацию к определению метода:
@Myntra
public String getLastName() {
return lastName;
}
Вам не понадобится код, который динамически добавляет аннотацию во время выполнения. Просто объявите это, и он будет скомпилирован. Навсегда.