java类
public class MyCls {
public void add(int a, int b){
System.out.println(a+b);
}
}
拦截器
import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 8348047103038121708L;
public Object invoke(MethodInvocation invocation) throws Throwable {
// TODO Auto-generated method stub
System.out.println("BEGIN");
Object ret = invocation.proceed();
System.out.println("END");
return ret;
}
}
配置
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
<include path="dao.dicon"/>
<component class="jp.co.test.MyCls">
<aspect pointcut="add">
<component class="jp.co.test.interceptor.MyInterceptor"/>
</aspect>
</component>
</components>
调用
public static void main(String[] args) {
// TODO Auto-generated method stub
S2Container container = S2ContainerFactory.create("testapp.dicon");
container.init();
MyCls myCls = (MyCls) container.getComponent(MyCls.class);
myCls.add(1, 2);
}
java源文件
org/seasar/framework/aop/javassist/AbstractGenerator.java
的173行
public Class toClass(final ClassLoader classLoader, final CtClass ctClass)
中体添加以下代码
File file = new File("D:\\gencls\\cls\\"+ctClass.getSimpleName()+".class");
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytecode);
fos.flush();
fos.close();
把动态生成的类保存起来。
把类反编译一下
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: MyCls$$EnhancedByS2AOP$$9f671b.java
package jp.co.test;
import java.lang.reflect.UndeclaredThrowableException;
// Referenced classes of package jp.co.test:
// MyCls
public class MyCls$$EnhancedByS2AOP$$9f671b extends MyCls
{
public void add$$invokeSuperMethod$$(int i, int j)
{
super.add(i, j);
Object _tmp = null;
}
public void add(int i, int j)
{
try
{
class .MethodInvocation..add0
implements S2MethodInvocation
{
public Class getTargetClass()
{
return targetClass;
}
public Method getMethod()
{
return method;
}
public AccessibleObject getStaticPart()
{
return method;
}
public Object getParameter(String name)
{
if(parameters == null)
return null;
else
return parameters.get(name);
}
public Object getThis()
{
return target;
}
public Object[] getArguments()
{
return arguments;
}
public Object proceed()
throws Throwable
{
if(interceptorsIndex < interceptors.length)
{
return interceptors[interceptorsIndex++].invoke(this);
} else
{
((MyCls..EnhancedByS2AOP.._cls9f671b)target).add$$invokeSuperMethod$$(((Number)arguments[0]).intValue(), ((Number)arguments[1]).intValue());
return null;
}
}
private static Class targetClass;
private static Method method;
private static MethodInterceptor interceptors[];
private static Map parameters;
private Object target;
private Object arguments[];
private int interceptorsIndex;
public .MethodInvocation..add0(Object target, Object arguments[])
{
this.target = target;
this.arguments = arguments;
}
}
Object obj = (new .MethodInvocation..add0(this, new Object[] {
new Integer(i), new Integer(j)
})).proceed();
return;
}
catch(RuntimeException runtimeexception)
{
throw runtimeexception;
}
catch(Error error)
{
throw error;
}
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public MyCls$$EnhancedByS2AOP$$9f671b()
{
}
}
分享到:
相关推荐
在给出的XML配置中,`<aop:config>`元素开启AOP支持,而`<aop:aspect>`元素用于定义切面,其内部通过`<aop:pointcut>`定义切点,并通过`<aop:before>`和`<aop:after>`指定通知。 为了使用这些配置,我们需要在代码...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
**AOP Alliance简介** AOP Alliance是一个开源项目,它的全称是Aspect Oriented Programming(面向切面编程)Alliance,是Java平台上的一个接口集合,为面向切面编程的实现提供了一个统一的API。这个库的主要目的是...
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在减少代码的重复性和增强可维护性,特别是在处理系统中的横切关注点时。这些关注点,如日志、事务管理、安全检查等,往往分散在系统的各个部分...
本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...
开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具...
Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...
面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在通过将关注点分离,提高软件的模块化程度。AOP的核心是切面,它封装了横切关注点,如日志、事务管理、性能监控等,使得这些功能可以独立于主...
在Java应用中,aopalliance.jar包扮演着至关重要的角色,它包含了一些核心接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`,这些接口定义了拦截器和通知的概念,它们是AOP的...
在IT行业中,AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它旨在提高软件的模块化程度,将关注点分离。在Java世界里,AOP常用于处理日志、事务管理、权限检查等横切关注点。当我们谈到“AOP...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
它定义了一些基础的AOP接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`,这些接口被广泛应用于诸如AspectJ、Spring AOP等AOP框架中。 二、AOPAlliance在Spring 2.0中的作用 ...
最后,`aopalliance-1.0.0.jar`是AOP联盟提供的一个接口库,它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
### AOP Alliance 白皮书核心知识点解析 #### 一、引言 AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它旨在通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,提高系统的...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
《AOP Alliance 1.0:面向切面编程的核心接口》 在软件开发领域,AOP(Aspect-Oriented Programming,面向切面编程)是一种重要的编程范式,它旨在提高代码的可重用性和模块化程度,使得关注点分离得以更好地实现。...