gpt4 book ai didi

aop - 如何覆盖某些类的 Class.getName() ?

转载 作者:行者123 更新时间:2023-12-01 15:40:47 25 4
gpt4 key购买 nike

我的目标是能够覆盖我从 CustomClass.class.getName() 和 CustomClass.getClass().getName() 返回的内容

它应该返回一个自定义值,我认为最好在像这样的属性中定义它

@NameOverride("Custom.fully.qualified.class.name")
public class CustomClass {}

有什么办法吗?

最佳答案

Fred 的回答没问题,但他的方面可以更优雅一些,代码更少,尤其是反射调用更少。抱歉,我更喜欢 AspectJ 原生代码风格,但@AspectJ 注释风格不会太长:

String around(Class clazz) : call(public String Class.getName()) && target(clazz) {
NameOverride nameOverride = (NameOverride) clazz.getAnnotation(NameOverride.class);
return nameOverride == null ? proceed(clazz) : nameOverride.value();
}

这里是完整的源代码。我添加了一个没有注释的类以显示不同的行为,并且还对类定义的限制 - @Target(ElementType.TYPE) - 注释类。我还显示了包名称和导入:

package test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface NameOverride {
String value();
}
package test;

public class NormalClass {}
package test;

@NameOverride("Custom.fully.qualified.class.name")
public class CustomClass {}
package test;

public class Main {
public static void main(String[] args) {
System.out.println(NormalClass.class.getName());
System.out.println(CustomClass.class.getName());
System.out.println(new NormalClass().getClass().getName());
System.out.println(new CustomClass().getClass().getName());
}
}
package aspectj;

import test.NameOverride;

public aspect GetNameOverrider {
@SuppressWarnings({ "unchecked", "rawtypes" })
String around(Class clazz) : call(public String Class.getName()) && target(clazz) {
NameOverride nameOverride = (NameOverride) clazz.getAnnotation(NameOverride.class);
return nameOverride == null ? proceed(clazz) : nameOverride.value();
}
}

输出:

test.NormalClass
Custom.fully.qualified.class.name
test.NormalClass
Custom.fully.qualified.class.name

关于aop - 如何覆盖某些类的 Class<?>.getName() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17324576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com