首页 技术 正文
技术 2022年11月21日
0 收藏 604 点赞 2,734 浏览 1721 个字

java强大的反射机制给动态代理带来了可能、能够自由穿梭在类与方法之间、简直神通广大、

动态代理的一个小例子,顺便看看神奇的AOP是如何实现的、代码如下:

首先声明的是一个接口Dog类

 package com.chenjun.test; public interface Dog
{
public void info();
public void run();
}

然后一个“猎狗类”实现了该接口

 package com.chenjun.test; public class GunDog implements Dog
{ @Override
public void info()
{
// TODO 自动生成的方法存根
System.out.println("猎狗");
} @Override
public void run()
{
// TODO 自动生成的方法存根
System.out.println("迅速奔跑");
} }

然后是一个用于切面编程的AOP类,比如在鬣狗类的方法执行前后分别调用method1和method2

代码如下:

 package com.chenjun.test; public class DogAop
{ public void method1()
{
System.out.println(" AOP method1");
}
public void method2()
{
System.out.println(" AOP method2");
} }

然后本例的最重要的一个类登场:

AOP将实际target调用的方法无情夹杀、  形成所谓的AOP

 /**
*
*/
package com.chenjun.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* @author Administrator
*
*/
public class MyInvocationHandle implements InvocationHandler
{
//需要被代理的对象
/* (非 Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
private Object target; //需要被代理的目标对象
public void setTarget(Object target)
{
this.target = target; //设置需要被代理的目标对象
}
public Object invoke(Object proxy, Method method, Object[] args) //开始代理了。挂羊头卖狗肉开始
throws Throwable
{
// TODO 自动生成的方法存根
DogAop dogAop = new DogAop(); //用于AOP的类实例化
dogAop.method1(); //AOP方法1
Object result = method.invoke(target, args); //真实的方法调用。利用反射
dogAop.method2(); //aop方法2 return result;
} }

最后来个主函数:

 package com.chenjun.test; import java.lang.reflect.Proxy; public class Main
{
public static void main(String []args)
{
Dog target = new GunDog(); //new一个需要被动态代理的对象
MyInvocationHandle handler = new MyInvocationHandle();
handler.setTarget(target); //挂羊头卖狗肉开始 Dog dog = (Dog)Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
dog.info(); //明修栈道,暗度陈仓 ,内部已经调用了代理类的方法。原对象的方法被添油加醋了、
dog.run(); //同上
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,026
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,517
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,364
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,145
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,779
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,856