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插件来编写代码。