Java 有可能借助注释在我自己的代码之外编织代码吗?
我有一个想法,想知道,这是否可能,如果是,如何。 我正在为其他用户开发一个图书馆,以简化他们的生活 我有两个注解 达尔文:Java 有可能借助注释在我自己的代码之外编织代码吗?,java,aspectj,load-time-weaving,Java,Aspectj,Load Time Weaving,我有一个想法,想知道,这是否可能,如果是,如何。 我正在为其他用户开发一个图书馆,以简化他们的生活 我有两个注解 达尔文: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Darwin {} 达尔文版本: @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DarwinVer
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Darwin {}
达尔文版本:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DarwinVersion {}
还有一个方面
达尔文方面:
public privileged aspect DarwinAspect {
private final static Logger LOGGER = LoggerFactory.getLogger(DarwinAspect.class);
after(): execution((@bla.Darwin *).new(..)) {
int numberOfDarwinVersionFields = 0;
LOGGER.debug("Try to add version!");
try {
Field darwinVersionField = null;
for (Field field : thisJoinPoint.getTarget().getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(DarwinVersion.class)) {
numberOfDarwinVersionFields++;
LOGGER.debug("DarwinVersion found on field " + field + "!");
darwinVersionField = field;
}
}
if (numberOfDarwinVersionFields > 1) {
LOGGER.error("To many @DarwinVersion annotations in class " + thisJoinPoint.getTarget().getClass() + "!");
} else if (numberOfDarwinVersionFields == 0) {
LOGGER.error("No DarwinVersion field found in class " + thisJoinPoint.getTarget().getClass() + "!");
} else if (darwinVersionField != null) {
LOGGER.debug("Set DarwinVersion on field " + darwinVersionField + "!");
darwinVersionField.setAccessible(true);
darwinVersionField.set(thisJoinPoint.getTarget(), VersionProvider.getVersion(thisJoinPoint.getTarget().getClass()));
}
} catch (IllegalAccessException e) {
LOGGER.error(e.getLocalizedMessage());
}
}
}
(此代码将在调用构造函数后自动为每个对象设置达尔文版本。)
其思想是编织任何用户类,这些用户使用注释声明自己的类。他们只应该将我的库添加到他们的类路径中。如本例所示:
@Darwin
public class Example {
@DarwinVersion
private Long version;
public static void main(String[] args) {
Example example = new Example();
System.out.println(example);
}
@Override
public String toString() {
return "Example{" + "version=" + version + '}';
}
}
此代码正在工作,但仅在我自己的项目中。在包含Darwin库并正在注释testclass的testproject中,注释将被忽略,并且不会编写任何代码。加载时编织可以吗?是的,可以,但不能不让用户做任何事情。至少她需要通过
-javaagent:pathto/aspectjweaver.jar将编织代理放在JVM命令行上
加载时编织几乎可以做任何事情,包括这一点。好的,但是我如何激活LTW而不需要用户做任何事情呢?目前,我使用Mojo的AspectJ Maven插件来编写代码。