java - 我在运行时向方法添加了预定义注释,我希望更改永久有效吗?

标签 java reflection annotations runtime java-assist

所以,假设我有一个 Person 类,我想在运行时向 getLastName() 方法添加 Myntra 注释(我已经使用 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() 函数的样子 --> 我在这里向 getLastName() 方法添加一个新的 Myntra 注释,然后使用 java 反射打印所有带有 Myntra 注释的方法。

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() 方法中的注释是永久的。 我不确定是否可能?如果是的话-->请告诉我该怎么做!!

最佳答案

将注释添加到方法定义中:

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

您不需要在运行时动态添加注释的代码。只要声明它,它就会被编译进去。永久地。

关于java - 我在运行时向方法添加了预定义注释,我希望更改永久有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168690/

相关文章:

java - 安卓。如何在按钮正上方显示弹出窗口

java - 如何检查字符串是否包含两个星号字符?

java - 在 Java9 中,如果我不知道它是模块,我如何反射性地加载一个类?

java - Reflection Java - 获取所有声明类的所有字段

java - 使用 Google GSON 库对 Java 模型类使用注释

java - 自定义注解

点分标识符的Java解析

java - 数组异常值未插入

go - 对字段 X 的一般属性,存在于多种类型中

swift - 不使用 CLLocationManager 显示当前位置