Project: AspectJ
Bug 36046 inter-type declaration bug with abstract classes
Reported: 2003-04-03 18:21:57 | Status: resolved fixed

This error occurs when you do an inter-type declaration on an interface, use declare parents to make an abstract base class implement it, and then try to use the declared (method), it fails. If you make the base class concrete, then this doesn't fail. The following code demonstrates the error. If you run java Driver you get: java.lang.AbstractMethodError: Derived.getExecutions(Ljava/lang/String;)I at Driver.main(Driver.java:23) Exception in thread "main" public class Driver { public static void main(String args[]) { Derived generator = new Derived(); System.out.println(generator.getExecutions("processEvents")); } static aspect MonitorBase { declare parents: Base implements ExecutionMonitor.MonitoredItem; } } class Derived extends Base { public String getName() { return null; } } abstract class Base { abstract public String getName(); } aspect ExecutionMonitor { /** marker interface to indicate the execution monitor should track calls and executions on this class. */ public interface MonitoredItem { int getExecutions(String methodName); } /** a Map of events to mutable integers */ public int MonitoredItem.getExecutions(String methodName) { return 0; } }

Files changed in fix:
tests/bugs/interAbstract/Driver.java weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java