扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国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依赖于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()语义):
使用jrockit.ext.weaving.UserDefinedFilter回调机制来实现更高级的匹配方式(与Spring AOPorg.springframework.aop.MethodMatcher和org.springframework.aop.ClassFilter相似)。
所有这些结构都是可选的,如果遇到null,就表示“任意匹配”。
jrockit.ext.weaving.ClassFilter提供一种类似的方式:
因此,以下代码匹配所有名称以“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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者