From 12d0a8268abb5100d7982e5be13c6cb0f8cdbf83 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Wed, 18 Nov 2015 14:43:41 -0800 Subject: Fix 478003: declare parents with generic itd npe --- docs/dist/doc/README-187.html | 101 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) (limited to 'docs/dist/doc/README-187.html') diff --git a/docs/dist/doc/README-187.html b/docs/dist/doc/README-187.html index cde9934e3..1d9b28c24 100644 --- a/docs/dist/doc/README-187.html +++ b/docs/dist/doc/README-187.html @@ -27,9 +27,106 @@ All rights reserved.
  • 1.8.7 available 9-Sep-2015 - + +

    ajdoc

    +

    The ajdoc tool has been fixed! It is now working again if run on a 1.7 JDK.

    + +

    Dynamic weaver attachment

    +

    The AspectJ loadtime weaving agent can now be dynamically attached to a JVM after it has started +(you don't need to use -javaagent). This offers extra flexibility but obviously any +classes loaded before attachment will not be woven.

    + +

    Here is a simple aspect:

    +
    +public aspect Azpect {
    +  before(): execution(* *(..)) {
    +    System.out.println(thisJoinPointStaticPart);
    +  }
    +}
    +
    + +

    Compiled via:

    + +
    ajc -1.8 Azpect.java -outxml
    + +

    This produces a compiled class Azpect.class and a file META-INF/aop-ajc.xml.

    + +

    I then have this sample application (same directory):

    + +
    +import java.lang.management.ManagementFactory;
    +import org.aspectj.weaver.loadtime.Agent;
    +import com.sun.tools.attach.VirtualMachine;
    +
    +public class Application {
    +
    +  public static void main(String[] args) {
    +    if (!isAspectJAgentLoaded())
    +      System.err.println("WARNING: AspectJ weaving agent not loaded");
    +    new Sample().doSomething();
    +  }
    +
    +  public static boolean isAspectJAgentLoaded() {
    +    try {
    +      Agent.getInstrumentation();
    +    } catch (NoClassDefFoundError e) {
    +      System.out.println(e);
    +      return false;
    +    } catch (UnsupportedOperationException e) {
    +      System.out.println(e);
    +      return dynamicallyLoadAspectJAgent();
    +    }
    +    return true;
    +  }
    +
    +  public static boolean dynamicallyLoadAspectJAgent() {
    +    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
    +    int p = nameOfRunningVM.indexOf('@');
    +    String pid = nameOfRunningVM.substring(0, p);
    +    try {
    +      VirtualMachine vm = VirtualMachine.attach(pid);
    +      String jarFilePath = System.getProperty("AGENT_PATH");
    +      vm.loadAgent(jarFilePath);
    +      vm.detach();
    +    } catch (Exception e) {
    +      System.out.println(e);
    +      return false;
    +    }
    +    return true;
    +  }
    +}
    +
    + +

    And this Sample class:

    +
    +public class Sample {
    +	public void doSomething() {
    +		System.out.println("Do something");
    +		System.out.println("Square of 7 = " + square(7));
    +	}
    +
    +	private int square(int i) {
    +		return i * i;
    +	}
    +}
    +
    + +

    Compile these with javac, but you must have the aspectjweaver and the JDK tools.jar on your classpath.

    + +

    Once compiled we can run it:

    + +
    java -DAGENT_PATH=<path-to>/aspectjweaver.jar Application
    + +

    What does it do? The main method calls the function that detects whether the agent is attached, if it is not then +it programmatically attaches it using the VirtualMachine class. Then the main method accesses the +Sample class. At this point in program execution the Sample class is loaded and because the agent has been +attached it gets woven. Notice that the Application class itself is not woven because it was loaded prior +to agent attachment.

    + +

    Thanks to Alexander Kriegisch for the sample code and the patch to add this behaviour to AspectJ.

    + -- cgit v1.2.3