java中的aop

刚开始接触java,总是听到AOP技术也就是面向切面编程技术,一直很迷糊,它到底是什么,干什么用的,实现原理是什么。今天在这里做个小结。

首先介绍一下AOP技术的由来:

在我们的业务系统中,有时候需要用业务系统中的”某些代码”去执行一些公共的动作,比如写日志、数据库连接管理、事务管理。那么这样就需要我们在很多方法中添加重复代码,这样使得代码重复率过高,也不好维护。那么我们想到的是要求每个Action都继承框架提供好的BaseAction,然后实现excute方法来实现。不过,这样的方式缺乏灵活性,那就是我们每个Action都需要写一个类来完成,对于复杂的系统,就需要写太多这样的类,因此,我们期望有一种动态的方式来代理操作,于是动态代理机制就出现了,AOP技术其实也是字节码增强技术,JVM提供的动态代理追根到底也是字节码增强技术。

字节码增强技术的实现原理:

字节码增强技术的实现有两种方式:

一种是通过创建原始类的一个子类,也就是动态创建的一个新的类继承原始类。

二种是很暴力的方式,直接修改Class字节码。

实现字节码增强技术的步骤:

一是在内存中获取原始的字节码,通过一些开源的API修改它的byte[]数组,得到一个新的byte[]。

二将这个新的byte[]数组写到PermGen区域,也就是加载新的byte[]替换原来的Class字节码。

实现原理和简介就介绍到这里,下面我们来个例子。

我们采用的开源api 为javaassit的API来实现字节码增强技术。

我们构造一个Transformer方法,它需要实现接口ClassFileTransformer,并实现transform方法,代码如下:

1、修改class字节码

public class TestTransformer implements ClassFileTransformer {

    @Override

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,

                            ProtectionDomain protectionDomain, byte[] classfileBuffer)

                                                                                      throws IllegalClassFormatException {

        System.out.println("load class:"+className);

        //判断是否是需要我们切得目标类

        if("/targetclass".equals(className)){

            CtClass ctClass=ClassPool.getDefault().get(className.replace(‘/‘, ‘.‘));

            //获取需要切得目标方法

            CtMethod ctMethod=ctClass.getDeclaredMethod("display1");

            //插入需要在此之前执行的方法

            ctMethod.insertBefore("name=\"XXXX\";");

            //插入需要在display1之后执行的方法

            ctMethod.insertAfter("System.out.println(value);");

            return ctClass.toBytecode();

        }

        // TODO Auto-generated method stub

        return null;

    }

}

2、注册到Instrumentation中,加载新的class字节码

  public class InstForTransformer{

   public static void premain(String agentArgs,Instrumentation instP){

     instP.addTransformer(new TestTransformer());

   } 

 }

如果注册成功,那么在JVM加载用户class是,就会调用对应的TestTransformer类的transform方法来获得修改后的字节码,达到修改字节码的目的。发现很多java教程都没有这方面的讲解,那就我来弥补一下吧

时间: 2024-10-13 22:31:38

java中的aop的相关文章

Java中IoC、AOP、Bean、PO、VO、DTO、EJB、POJO等常见概念简述

JavaBeans 是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中. 特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性. 名称中的“Bean”是用于Java的可重用软件组件的惯用叫法. IoC(Inversion of Control) 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency

Java——面向切面编程,Spring中的AOP编程

面向切面编程 AOP思想:将横向重复代码,纵向抽取出来 AOP体现--Filter AOP体现--拦截器 AOP体现--动态代理 Spring中实现AOP思想 原理:Spring可以为容器中管理的对象生成代理对象 代理分为动态代理和cglib代理: 动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术,换句话说,就是代理对象和被代理要实现同一接口 cglib代理 第三方代理技术,cglib代理,可以对任何类生成代理,代理的原理是对目标对象进行继承代理,

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

java中的动态代理机制

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.下面通过代码来学习java中的动态代理技术. 首先定义一个接口: package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public interface Perform { public void play(); } 实

聊聊Javascript中的AOP编程

Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla 这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过du

聊Javascript中的AOP编程

我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过duck typing.举一

【java】java中的注解(Annotation)是如何工作的?

Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架).这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧. 什么是注解? 用一个词就可以描述注解,那就是元数据,即

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

spring MVC 管理HttpClient---实现在java中直接向Controller发送请求

在spring MVC中,大多数时候是由客户端的页面通过ajax等方式向controller发送请求,但有时候需要在java代码中直接向controller发送请求,这时可以使用HttpCilent实现. 首先用到的包是httpclient-4.3.5.jar和httpcore-4.3.2.jar 先看下面代码: package module.system.common; import java.io.IOException; import java.util.ArrayList; import