Я добавил предопределенную аннотацию к методу во время выполнения, я хочу, чтобы изменения были постоянными? - PullRequest
0 голосов
/ 11 февраля 2020

Итак, допустим, у меня есть класс 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, но не имеют никакого отношения к моему вопросу.

И вот как моя главная () функции выглядят следующим образом -> Я добавляю новую аннотацию 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));
            }
        }

    }

}

Так он отлично работает во время выполнения -> OUTPUT IS:

Ravan lanka wale
0000 0000 0000
lanka wale

Но я хочу, чтобы аннотация, добавленная в метод getLastName (), была постоянной и навсегда. Я не уверен, возможно ли это или нет? Если да -> скажите, пожалуйста, как это сделать !!

1 Ответ

0 голосов
/ 11 февраля 2020

Добавьте аннотацию к определению метода:

@Myntra
public String getLastName() {
    return lastName;
}

Вам не понадобится код, который динамически добавляет аннотацию во время выполнения. Просто объявите это, и оно будет скомпилировано. Постоянно.

...