科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件JRockit JVM对AOP的支持

JRockit JVM对AOP的支持

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  面向方面编程(Aspect-Oriented Programming,AOP)正在软件社区和企业界中获得强大的发展动力。自从20世纪90年代Xerox引入了AOP之后,AOP经过研究团体、开源社区和企业界的数次推动和革新

作者:中国IT实验室 来源:中国IT实验室 2007年8月24日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

  其语法风格与Java开发人员使用java.lang.reflect.Method.invoke(null/*static method*/, .../*args*/)对方法进行反射式调用一样。但是,利用JVM的AOP支持,底层的动作调用根本不涉及任何反射。

  允许用户控制动作实例,就会产生有趣的用例。例如,可以实现一个简单的委托模式,在运行时用另一个实现替换整个动作实例,而不涉及JVM的内部组件。

  注意,这将有助于(按照规定)实现AOP方面实例化模型,比如issingleton()、pertarget()、perthis()、percflow()等等,同时不会将JVM API限制在某些预定义的语义上。

  在将预定注册到编织器实例之前,赋予它一个类型作为建议类型:before、instead-of、after-returning或after-throwing。

  可以编写下面这样的代码来创建预定:

// Get a Weaver instance that will act as a
// container for the subscription(s) we create
Weaver w = WeaverFactory.getWeaver();

// regular java.lang.reflect is used to refer
// to the action method "simpleStaticAction()"
Method staticActionMethod =
  SimpleAction.class.getDeclaredMethod(
      "simpleStaticAction",
      new Class[0]//no arguments
  );

MethodSubscription ms = new MethodSubscription(
    .../* where to match*/,
    InsertionType.BEFORE,
    staticActionMethod
);

w.addSubscription(ms);

  该代码示例假设用户使用静态动作方法实现。也可以使用实例方法编写这个示例,在这种情况下,应该传递给MethodSubscription一个包含类实例。

// Use of an action instance to refer to the
// non static action method "simpleAction()"
Method actionMethod =
  SimpleAction.class.getDeclaredMethod(
      "simpleAction",
      new Class[0]// no arguments
  );
// Instantiate the action instance
SimpleAction actionInstance = new SimpleAction();
MethodSubscription ms2 = new MethodSubscription(
    ...,// where to match, explained below
    InsertionType.BEFORE,
    actionMethod,
    actionInstance
);

w.addSubscription(ms2);

  诸如within()和withincode()类型模式之类的AOP语义也通过该API的变体实现。

API细节:预定

  如前面的代码示例所示,预定API依赖于java.lang.reflect.*对象模型和一些简单的抽象化(比如jrockit.ext.weaving.WMethod)来合并方法、构造函数和类的静态初始化器处理。

  new MethodSubscription(...)调用的第一个参数必须是jrockit.ext.weaving.Filter实例,这个实例具有几个具体实现以便匹配方法、字段等等。

  jrockit.ext.weaving.MethodFilter实例用作定义,JVM编织器实现根据它进行联结点阴影匹配(shadow matching)。jrockit.ext.weaving.MethodFilter允许根据以下各项进行过滤(还提供额外的结构支持within()/withincode()语义):

  • 方法修饰符(比如使用java.lang.reflect.Modifier时的int)。
  • Class<? extends java.lang.annotation.Annotation>,匹配方法运行时可见性注释。
  • jrockit.ext.weaving.ClassFilter实例,匹配声明类型。
  • jrockit.ext.weaving.StringFilter实例,匹配方法名。
  • jrockit.ext.weaving.ClassFilter实例,匹配方法返回类型。
  • jrockit.ext.weaving.UserDefinedFilter实例,用于实现更精细的匹配逻辑。

  使用jrockit.ext.weaving.UserDefinedFilter回调机制来实现更高级的匹配方式(与Spring AOPorg.springframework.aop.MethodMatcher和org.springframework.aop.ClassFilter相似)。

  所有这些结构都是可选的,如果遇到null,就表示“任意匹配”。

  jrockit.ext.weaving.ClassFilter提供一种类似的方式:

  • Class<? extends java.lang.annotation.Annotation>,匹配类运行时可见性注释。
  • Class,匹配类类型。
  • boolean值,表示是否匹配子类型。

  因此,以下代码匹配所有名称以“bar”开头的方法调用。注意,在这个非常简单的例子中传递了好几个null值:

StringFilter sf =
  new StringFilter("bar", STARTSWITH);

MethodFilter mf =
  new MethodFilter(0, null, null, sf, null, null);

MethodSubscription ms = new MethodSubscription(
    mf,
    InsertionType.BEFORE,
    staticActionMethod
);

w.addSubscription(ms);
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章