动态代理和AOP切面编程

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/*

* 动态代理和AOP切面编程

*/

//定义一个接口

interface Person {

void eat();

void breath();

}

// 定义一个实现接口的实现类,即为被代理类

class Student implements Person {

@Override

public void eat() {

System.out.println("学生吃饭");

}

@Override

public void breath() {

System.out.println("学生呼吸");

}

}

// 定义一个实现InvocationHandler接口的实现类

class MyInvocationHandler implements InvocationHandler {

Object obj;// 声明一个被代理类的对象

public void setObject(Object obj) {

this.obj = obj;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Man m = new Man();

m.method1();

Object returnVal = method.invoke(obj, args);

m.method2();

return returnVal;

}

}

// 定义一个代理类

class MyProxy {

public static Object getProxyInstance(Object obj) {

MyInvocationHandler handler = new MyInvocationHandler();

handler.setObject(obj);

return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj

.getClass().getInterfaces(), handler);

}

}

// 定义一个类,有两个方法

class Man {

public void method1() {

System.out.println("-------------方法一---------------");

}

public void method2() {

System.out.println("**************方法二**************");

}

}

public class TestDynamicProxyAndAOP {

public static void main(String[] args) {

// 1.创建一个被代理类的对象

Student s = new Student();

// 2.创建一个代理类对象

Object obj = MyProxy.getProxyInstance(s);

Person p = (Person) obj;

// 3.调用被代理类的方法

p.eat();

System.out.println();

p.breath();

}

}

执行结果:

-------------方法一---------------

学生吃饭

**************方法二**************

-------------方法一---------------

学生呼吸

**************方法二**************

时间: 2024-12-25 21:16:32

动态代理和AOP切面编程的相关文章

动态代理和AOP

之前说过了我对IOC的理解,这篇文章说以下我对动态代理和基本的对AOP的理解. 所谓动态代理就是,在运行时,动态创建实现了一组指定接口的实现类对象. 比如有: interface A { } interface B{ } 即: Object o = 方法(new Class[] {A.class,B.class}) , o实现了A和B两个接口 但是我们在运行时是无法写源代码来进行这个类的创建. 这时候我们需要用到Proxy类下的newProxyInstance()方法. 1.newProxyIn

黑马程序员--Java高新(10)_动态代理和AOP编程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一, 动态的核心 动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用! 代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑: 1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,inv

关于反射和动态代理和AOP

package Exercise.reflect; /** * 反射把java中所有的东西都当做对象,甚至是类的本身也作为一种对象,并把它作为Class的对象的实例: * 反射是把类.类的属性.方法都作为一个对象类进行剖析: * * 为什么需要反射?把类变成活的,当一个类经过java虚拟机编译之后会生成对应的字节码文件,即xxx.class, * 而反射就是去解析这个类的信息,包括其中所包含的变量和方法: * 在运行期间去加载一个类,并对类进行剖析,甚至可以给一个类的属性动态的赋值,也可以去唤醒

【Spring】AOP之JDK动态代理和CGLib动态代理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.JAVA动态代理  1.1 代理模式         代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创

spring aop原理 JDK动态代理和CGLIB动态代理

Spring的两大特性是IOC和AOPIOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果.理解spring的ioc也很重要.但是今天主要来和大家讲讲aop.AOP 广泛应用于处理一些具有横切性质的系统级服务,AOP 的出现是对 OOP 的良好补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP实现的关键在于AOP框架自动创建的AOP代理.AOP代理主要分为静态代理和动态代理, 静态代理的代表为AspectJ:动态代理则

Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. cglib封装了asm,可以在运行期动态生成新的class. cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制. 原理区别: java动态代理是利用反射机

黑马程序员_代理和AOP(一)

/** * 代理和AOP(一) * * 1.分析代理类的作用与原理及AOP的概念 * * 1.1 代理类:一个代理类通常有自己的代理目标类,代理类是对目标类的代理,一般代理类的方法和目标类的方法签名一致,是对 * 目标类的包装,代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标的方法返回的结果之外, * 还可以在代理类的方法中 加入一些系统功能代码,添加的位置有四个地方: * 分别是目标方法调用前,目标方法调用后,目标方法调用前后,在处理目标方法异常的catch块中. * 例如: *

Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特别长.知道了问题之后,就需要对查询比较慢的接口进行优化,但哪些接口需要优化.哪些不需要呢?只能通过日志里的执行时间来判断,那么如何才能知道每一个接口的执行时间呢? 如果想学习Java工程化.高性能及分布式.深入浅出.微服务.Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级

JDK动态代理和CGLIB动态代理

转载自http://www.itzhai.com/java-dong-tai-dai-li-zhi-jdk-dong-tai-dai-li-he-cglib-dong-tai-dai-li-mian-xiang-qie-mian-bian-cheng-aop-yuan-li.html 静态代理 静态代理相对来说比较简单,无非就是聚合+多态: 参考:设计模式笔记 – Proxy 代理模式 (Design Pattern) 动态代理 我们知道,通过使用代理,可以在被代理的类的方法的前后添加一些处理方