aboutsummaryrefslogtreecommitdiffstats
path: root/docs/adk15ProgGuideDB/autoboxing.adoc
diff options
context:
space:
mode:
Diffstat (limited to 'docs/adk15ProgGuideDB/autoboxing.adoc')
-rw-r--r--docs/adk15ProgGuideDB/autoboxing.adoc78
1 files changed, 78 insertions, 0 deletions
diff --git a/docs/adk15ProgGuideDB/autoboxing.adoc b/docs/adk15ProgGuideDB/autoboxing.adoc
new file mode 100644
index 000000000..ced4f49fe
--- /dev/null
+++ b/docs/adk15ProgGuideDB/autoboxing.adoc
@@ -0,0 +1,78 @@
+[[autoboxing]]
+== Autoboxing and Unboxing
+
+[[boxing-inJava5]]
+=== Autoboxing and Unboxing in Java 5
+
+Java 5 (and hence AspectJ 1.5) supports automatic conversion of
+primitive types (int, float, double etc.) to their object equivalents
+(Integer, Float, Double,...) in assignments and method and constructor
+invocations. This conversion is know as autoboxing.
+
+Java 5 also supports automatic unboxing, where wrapper types are
+automatically converted into their primitive equivalents if needed for
+assignments or method or constructor invocations.
+
+For example:
+
+....
+int i = 0;
+i = new Integer(5); // auto-unboxing
+
+Integer i2 = 5; // autoboxing
+....
+
+[[autoboxing-in-aspectj5]]
+=== Autoboxing and Join Point matching in AspectJ 5
+
+Most of the pointcut designators match based on signatures, and hence
+are unaffected by autoboxing. For example, a call to a method
+
+....
+public void foo(Integer i);
+....
+
+is _not_ matched by a pointcut `call(void foo(int))` since the signature
+declares a single `Integer` parameter, not an `int`.
+
+The `args` pointcut designator is affected by autoboxing since it
+matches based on the runtime type of the arguments. AspectJ 5 applies
+autoboxing and unboxing in determining argument matching. In other
+words, `args(Integer)` will match any join point at which there is a
+single argument of type `Integer` or of type `int`.
+
+* args(Integer) and args(int) are equivalent
+* args(Float) and args(float) are equivalent
+* args(Double) and args(double) are equivalent
+* args(Short) and args(short) are equivalent
+* args(Byte) and args(byte) are equivalent
+* args(Long) and args(long) are equivalent
+* args(Boolean) and args(boolean) are equivalent
+
+Autoboxing and unboxing are also applied when binding pointcut or advice
+parameters, for example:
+
+....
+pointcut foo(int i) : args(i);
+
+before(Integer i) : foo(i) {
+ ...
+}
+....
+
+[[autoboxing-and-method-dispatch]]
+=== Inter-type method declarations and method dispatch
+
+Autoboxing, unboxing, and also varargs all affect the method dispatch
+algorithm used in Java 5. In AspectJ 5, the target method of a call is
+selected according to the following algorithm:
+
+[arabic]
+. Attempt to locate a matching method or inter-type declared method
+without considering autoboxing, unboxing, or vararg invocations.
+. If no match is found, try again considering autoboxing and unboxing.
+. Finally try again considering both autoboxing, unboxing, and varargs.
+
+One consequence is that a directly matching inter-type declared method
+will take precedence over a method declared locally in the target class
+but that only matches via autoboxing.