最近在研究 面向切面编程 这个话题;后来发现Aspectj是AOP 中比较早 的实现。学习中发现我很是不理解的问题:
1.在Eclipse_helio 版本的 ajdt中 使用 aspect 关键字 硬编码 和@Aspect 声明式编码方式 前者能很好运行 后者则出 现了我很不理解的问题..
2.aspectj有自己的编译原理 那么她怎么和普通的项目进行整合?就比如说 建立一个简单的WEB 工程 想在Servlet
里面的doGet 和 doPost 执行之前 进行 页面参数的验证 怎样才能 使*.aj 文件注入 servlet里面
3. aspectj已经出现了很长一段时间了为什么没有流行起来 反倒是 spring 支持Aspectj 的@Annotation 的AOP比较流行?
关于第1个问题 代码:
代码思路是 对pojo的属性进行监控。
pojo(简单的getter setter)
package example.bean.exer.pojo;
public class EntityBean{
private String id;
private String name;
private String descrtion;
package example.bean.exer.pojo;
public class Father {
private String id;
package example.bean.exer.pojo;
public class Sun extends Father {
private String name;
private int age;
private double money;
PropertyChangeListener
package example.bean.exer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
//@Other
public class BeanPropertyListner implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
System.out.println("监听 :"+evt.getPropertyName()+" oldValue:"+evt.getOldValue()+" newValue:"+evt.getNewValue());
}
}
切面(硬编码)
package example.bean.exer;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.Method;
public aspect BeanAspect {
// declare @method :execution(public *.new(..));
// declare @type :example.bean.exer.*:@Enity;
// declare parents : (@Enity *) extends Father;
public interface PropertyChange{};
//给EntityBean 注入一个support 的属性
private PropertyChangeSupport PropertyChange.support = new PropertyChangeSupport(this);
// //给EntityBean 注入一个doSay方法。
public PropertyChangeSupport PropertyChange.getSupport(){
return support;
}
declare parents :example.bean.exer.pojo.* implements PropertyChange;
pointcut testconMethod(): execution(public example.bean.exer.pojo.*.new(..));
before():testconMethod(){
PropertyChange eb=(PropertyChange)thisJoinPoint.getTarget();
eb.support.addPropertyChangeListener(new BeanPropertyListner());
}
pointcut testOtherMethod():execution(* example.bean.exer.pojo.*.set*(..));
before():testOtherMethod(){
PropertyChange eb=(PropertyChange)thisJoinPoint.getTarget();
String methodName=thisJoinPoint.getSignature().getName();
String fieldName=methodName.substring(3);
String getterName="get"+fieldName;
Object o=null;
try{
Method m=eb.getClass().getMethod(getterName, null);
o=m.invoke(eb, null);
}catch(Exception e){
e.printStackTrace();
}
eb.support.firePropertyChange(fieldName,o,thisJoinPoint.getArgs()[0]);
}
}
切面(声明annotation)
package example.bean.exer;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.DeclareParents;
import org.aspectj.lang.annotation.Pointcut;
@SuppressWarnings("unused")
@Aspect
public class ModelFieldKeeping {
public interface PropertyChange{
PropertyChangeSupport getSupport();
}
public static class PropertyChangeImpl implements PropertyChange{
private PropertyChangeSupport support=new PropertyChangeSupport(this);
@Override
public PropertyChangeSupport getSupport() {
// TODO Auto-generated method stub
return support;
}
}
@DeclareParents(value="example.bean.exer.pojo.*",defaultImpl=PropertyChangeImpl.class)
private PropertyChange implementedInterface;
@Pointcut("execution(public example.bean.exer.pojo.*.new(..))")
private void constructorMethod(){}
@Pointcut("execution(* example.bean.exer.pojo.*.set*(..))")
private void setMethod(){}
@Before("constructorMethod()")
public void addListner(JoinPoint jp){
PropertyChange eb=(PropertyChange)jp.getTarget();
eb.getSupport().addPropertyChangeListener(new BeanPropertyListner());
}
@Before("setMethod()")
public void fireListner(JoinPoint jp){
PropertyChange eb=(PropertyChange)jp.getTarget();
//fieldName
String methodName=jp.getSignature().getName();
String fieldName=jp.getTarget().getClass().getName()+"."+methodName.substring(3);
//获取原来值
String getterName="get"+methodName.substring(3);
Object o=null;
try{
Method m=eb.getClass().getMethod(getterName, null);
o=m.invoke(eb, null);
}catch(Exception e){
e.printStackTrace();
}
eb.getSupport().firePropertyChange(fieldName,o,jp.getArgs()[0]);
}
}
测试:采用硬编码方式 可以完美输出 但是采用 声明式 则出现 pojo 的方法不能用 我反编译了.class 文件觉得是么的问题的..
package example.bean.exer;
import example.bean.exer.pojo.EntityBean;
import example.bean.exer.pojo.Father;
import example.bean.exer.pojo.Sun;
//@Other
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EntityBean eb = new EntityBean();
eb.getClass();
eb.setId("sssssssssssss");
eb.setName("ss");
System.out.println(eb.getId());
System.out.println(eb.getName());
Father f = new Father();
System.out.println(f.getSupport());
Sun sun = new Sun();
sun.setAge(9);
sun.setId("id。。。");
sun.setMoney(0.1234);
sun.setName("hyaci");
System.out.println(sun.getSupport());
}
}
以上问题 希望ITeye 的各位朋友 帮忙解决...谢
分享到:
相关推荐
AspectJ是一种广泛使用的Java语言的面向切面编程(AOP)扩展。它允许开发者将关注点模块化,使得系统中的交叉切面(如日志、事务管理、安全性等)可以独立于核心业务逻辑进行处理。本指南将深入探讨AspectJ的核心概念...
《AspectJ 1.9.6.jar:Java AOP编程的基石》 AspectJ是Java平台上的一种面向切面编程(AOP)框架,它允许开发者将关注点分离,提高代码的可维护性和可复用性。AspectJ 1.9.6.jar文件是AspectJ库的核心组成部分,它...
aspectj-1.7.0.jar aspectj的包
AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更有效地处理横切关注点,即那些跨越多个类或方法,不易封装的传统OOP难以处理的问题,如日志、事务管理、性能监控等。在本资料中...
AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更方便地处理系统中的横切关注点,如日志、事务管理、安全性等。本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,...
AspectJ 是一个强大的面向切面编程(AOP)的框架,它允许开发者在Java应用程序中分离关注点,将横切逻辑(如日志、事务管理、安全性等)与核心业务逻辑相分离。`aspectj-1.6.9.jar` 是AspectJ框架的一个特定版本,即...
AspectJ和Spring的整合在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)时。AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑...
AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许开发者在不改变原有代码结构的情况下,插入关注点代码。在Spring AOP框架中,AspectJ被广泛用于实现更精细粒度的切面逻辑,提供比Spring默认的...
【标题】"org.aspectj,aspectj项目库(org.aspectj).zip" 提供的是开源项目AspectJ的源码库。AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许程序员以声明式方式处理系统的横切关注点,如日志...
AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...
**Aop之AspectJ详解解读** 在软件开发中,面向切面编程(AOP)是一种设计模式,它允许程序员将关注点分离到不同的模块,从而提高代码的可维护性和复用性。AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大...
AspectJ是Java平台上的一个开源框架,它为Java开发者提供了强大的AOP支持,使我们能够方便地定义和实现切面。 标题"AspectJ面向切面的例子"指的是通过AspectJ实现的一个实际项目,这个例子是一个名为"Spacewar"的小...
aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php
《AspectJ in Action》是一本深入探讨面向切面编程(Aspect-Oriented Programming, AOP)的权威书籍,由Eric Evans和Manning Publications在2003年出版。该书详细介绍了AspectJ这一强大的Java语言扩展,它允许开发者...
《AspectJ Cookbook》是一本专为开发者准备的指南,它深入介绍了AspectJ这一强大的面向切面编程(AOP)框架。面向切面编程是一种编程范式,旨在提高软件的可维护性和可重用性,通过将关注点分离,使得业务逻辑与系统...
AspectJ是一个功能强大的面向切面编程(AOP)框架,它允许开发者以声明的方式在Java程序中定义横切关注点(cross-cutting concerns),如日志记录、事务管理等。AOP通过引入切面(aspects)来模块化这些关注点,而切...
《Spring AOP与AspectJ深度解析》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的面向切面编程(AOP)特性极大地简化了代码的维护和扩展。AspectJ是Spring AOP的重要组成部分,...
AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志、事务管理等模块化,实现代码的解耦。AOP的核心理念是将横切关注点(如日志、异常处理等)与业务逻辑...
AspectJ 在 Android Studio 中的应用 AspectJ 是一种面向 Aspect 编程语言,用于在 Java 语言中实现面向方面编程。AspectJ 可以帮助开发者更好地理解和优化 Android 应用程序的性能和行为。在 Android Studio 中...