AspectJ编译问题,java8 lambda表达式,switch语句

时间:2015-06-20 18:05:19

标签: java lambda java-8 aop aspectj

我正在尝试使用aspectJ来进行AOP编程。 但AJC编译器抛出错误,javac编译器工作正常。

Error:(19, 0) ajc: The method getKey() is undefined for the type Object
Error:(19, 0) ajc: The method getValue() is undefined for the type Object
Error:(22, 0) ajc: Cannot refer to the static enum field ApplicationType.transport within an initializer
Error:(25, 0) ajc: Cannot refer to the static enum field ApplicationType.exposure within an initializer
Error:(28, 0) ajc: Cannot refer to the static enum field ApplicationType.manufacture within an initializer
Error:(31, 0) ajc: Cannot refer to the static enum field ApplicationType.factoryhub within an initializer

我的源文件是Maps.java ApplicationType.java -

public class Maps {
    public static <K, V> Map<K, V> toMap(Map.Entry<K, V>... entries) {
        return Collections.unmodifiableMap(
          Stream
            .of(entries)
             // compile error The method getKey() is undefined for the type Object
            .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
    }
}
ApplicationType.java 
public enum ApplicationType {

    transport(0),
    exposure(1),
    manufacture(2),
    factoryhub(3);

    private int code;

    ApplicationType(int code) {
        this.code = code;
    }

    ApplicationType(String application) {
        for (ApplicationType value : values()) {
            if (value.name().equals(application)) {
                switch (value) {
//ajc: Cannot refer to the static enum field ApplicationType.transport within an initializer
                    case transport:
                        setCode(0);
                        break;
                    case exposure:
                        setCode(1);
                        break;
                    case manufacture:
                        setCode(2);
                        break;
                    case factoryhub:
                        setCode(3);
                        break;
                    default:
                        break;
                }
            }
        }
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

1 个答案:

答案 0 :(得分:1)

修复

Error:(19, 0) ajc: The method getKey() is undefined for the type Object
Error:(19, 0) ajc: The method getValue() is undefined for the type Object

上述错误的原因是aspectj无法发现.toMap结果的类型。无论何时执行收集操作,都会延迟评估Lambda表达式。要修复错误,请参阅下面代码的变体。明确存储.toMap操作的结果,然后存储用户Collections.unmodifiableMap

public static <K, V> Map<K, V> toMap(final Map.Entry<K, V>... entries) {
    Map<K, V> map = Stream.of(entries).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    return Collections.unmodifiableMap(map);
}

修复:

Error:(22, 0) ajc: Cannot refer to the static enum field ApplicationType.transport within an initializer

枚举的重载构造函数Application(String name)看起来不正确。您可以简化枚举代码,如下所示,以消除错误。

public enum ApplicationType {
    transport(0),
    exposure(1),
    manufacture(2),
    factoryhub(3);

    private int code;

    ApplicationType(int code) {
        this.code = code;
    }

    public static ApplicationType parse(String name) {
        return ApplicationType.valueOf(name.toLowerCase());
    }

    public int getCode() {
        return code;
    }
}

我添加了parse方法,以防您根据name返回枚举。

希望这有帮助。