import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
import org.aspectj.lang.reflect.FieldSignature; | |||||
@Retention(RetentionPolicy.RUNTIME) | |||||
@interface Marker { | |||||
String message(); | |||||
} | |||||
public class AnnoBinding { | |||||
public static void main(String[] argv) { | |||||
long stime = System.currentTimeMillis(); | |||||
for (int i = 0; i < 10000; i++) { | |||||
runOne(); | |||||
} | |||||
long etime = System.currentTimeMillis(); | |||||
long manual = (etime - stime); | |||||
stime = System.currentTimeMillis(); | |||||
for (int i = 0; i < 10000; i++) { | |||||
runTwo(); | |||||
} | |||||
etime = System.currentTimeMillis(); | |||||
long woven = (etime - stime); | |||||
System.out.println("woven=" + woven + " manual=" + manual); | |||||
if (woven > manual) { | |||||
throw new RuntimeException("woven=" + woven + " manual=" + manual); | |||||
} | |||||
if (X.a != X.b) { | |||||
throw new RuntimeException("a=" + X.a + " b=" + X.b); | |||||
} | |||||
} | |||||
@Marker(message = "string") | |||||
static int field1; | |||||
@Marker(message = "string") | |||||
static int field2; | |||||
public static void runOne() { | |||||
field1 = field1 * 2; // set and get jps | |||||
} | |||||
public static void runTwo() { | |||||
field1 = field1 * 2; // set and get jps | |||||
} | |||||
} | |||||
aspect X { | |||||
pointcut pManual(): withincode(* runOne(..)) && get(@Marker * *); | |||||
pointcut pWoven(Marker l): withincode(* runTwo(..)) && get(@Marker * * ) && @annotation(l); | |||||
public static int a,b; | |||||
before(): pManual() { | |||||
Marker marker = (Marker) ((FieldSignature) thisJoinPointStaticPart.getSignature()).getField().getAnnotation(Marker.class); | |||||
String s = marker.message(); | |||||
a+=s.length(); | |||||
} | |||||
before(Marker l): pWoven(l) { | |||||
String s = l.message(); | |||||
b+=s.length(); | |||||
} | |||||
} |
import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
import org.aspectj.lang.reflect.FieldSignature; | |||||
import com.sun.org.apache.bcel.internal.classfile.Field; | |||||
@Retention(RetentionPolicy.RUNTIME) | |||||
@interface Marker { | |||||
String message(); | |||||
} | |||||
public class AnnoBinding2 { | |||||
public static void main(String[] argv) { | |||||
runOne(); | |||||
runTwo(); | |||||
java.lang.reflect.Field[] fs = AnnoBinding2.class.getDeclaredFields(); | |||||
int count = 0; | |||||
for (java.lang.reflect.Field f: fs) { | |||||
if (f.getName().startsWith("ajc$anno")) { | |||||
count++; | |||||
} | |||||
} | |||||
System.out.println(count+" ajc$anno$NNN fields"); | |||||
} | |||||
@Marker(message = "foo") | |||||
static int field1; | |||||
@Marker(message = "bar") | |||||
static int field2; | |||||
public static void runOne() { | |||||
field1 = field1 * 2; // set and get jps | |||||
} | |||||
public static void runTwo() { | |||||
field2 = field2 * 2; // set and get jps | |||||
} | |||||
} | |||||
aspect X { | |||||
pointcut pWoven(Marker l): withincode(* run*(..)) && get(@Marker * * ) && @annotation(l); | |||||
before(Marker l): pWoven(l) { | |||||
System.out.println(thisJoinPointStaticPart+" "+l); | |||||
} | |||||
} |
// runTest("itd split compilation"); | // runTest("itd split compilation"); | ||||
// } | // } | ||||
public void testAnnotationFieldBindingOptimization_356612() throws Exception { | |||||
runTest("annotation field binding optimization"); | |||||
} | |||||
public void testAnnotationFieldBindingOptimization_356612_2() throws Exception { | |||||
runTest("annotation field binding optimization - 2"); | |||||
} | |||||
public void testThisAspectInstance_239649_1() throws Exception { | public void testThisAspectInstance_239649_1() throws Exception { | ||||
// simple case | // simple case | ||||
runTest("thisAspectInstance - 1"); | runTest("thisAspectInstance - 1"); |
<suite> | <suite> | ||||
<ajc-test dir="bugs1612/pr356612" title="annotation field binding optimization"> | |||||
<compile files="AnnoBinding.java" options="-1.5"/> | |||||
<run class="AnnoBinding"> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs1612/pr356612" title="annotation field binding optimization - 2"> | |||||
<compile files="AnnoBinding2.java" options="-1.5"/> | |||||
<run class="AnnoBinding2"> | |||||
<stdout> | |||||
<line text="get(int AnnoBinding2.field1) @Marker(message=foo)"/> | |||||
<line text="get(int AnnoBinding2.field2) @Marker(message=bar)"/> | |||||
<line text="2 ajc$anno$NNN fields"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs1612/pr354683" title="itd split compilation"> | <ajc-test dir="bugs1612/pr354683" title="itd split compilation"> | ||||
<compile files="util/CommonData.java util/CommonDataImpl.java util/CommonDataImplementation.aj util/DerivedCommonDataInterface.java util/DerivedCommonDataInterfaceImpl.java util/DerivedCommonDataInterfaceImplementation.aj" options="-1.5" outjar="code.jar"/> | <compile files="util/CommonData.java util/CommonDataImpl.java util/CommonDataImplementation.aj util/DerivedCommonDataInterface.java util/DerivedCommonDataInterfaceImpl.java util/DerivedCommonDataInterfaceImplementation.aj" options="-1.5" outjar="code.jar"/> | ||||
<compile files="main/AbstractBaseClass.java main/DerivedClass.java main/Whatever.java " options="-1.5" aspectpath="code.jar"/> | <compile files="main/AbstractBaseClass.java main/DerivedClass.java main/Whatever.java " options="-1.5" aspectpath="code.jar"/> |