您的位置:首页 > 编程语言 > Java开发

JAVA 动态代理与AOP编程(面向切面编程)

2015-05-30 19:07 771 查看
前奏:

问题:如果我们在编码中遇到三个代码块,在每个代码块中都有相同的一段代码,我们可能会考虑将相同的代码块重构成一个公用的方法,然后再这个代码块中分别调用这个方法,但是又出现一个问题 那就是这三个代码块又和这个特定方法耦合了。

那么什么才是最理想的状态:这三个代码块即可以执行该重构的方法,又无需在程序中,以硬编码的方法直接调用该方法;

下面看看怎么用动态代理的方式实现最终目的:

package com.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Human
{
void info();

void fly();
}

class SuperMan implements Human
{

@Override
public void info()
{
System.out.println("i am superman");
}

@Override
public void fly()
{
System.out.println("i belive i can fly!");
}

}

class MyInvocationHandler00 implements InvocationHandler
{
Object obj;//被代理类对象生命

public void setObject(Object obj)
{
this.obj = obj;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
HumanUtil util = new HumanUtil();

util.method00();
Object returnValue = method.invoke(obj, args);// 动态的方法,从切面的角度动态改变该方法,即中间的这个方法是可变的
util.method01();

return returnValue;
}

}

class MyProxy
{
//动态的创建一个代理类的对象
public static Object getProxyInstance(Object obj)
{
MyInvocationHandler00 myInvocationHandler00 = new MyInvocationHandler00();
myInvocationHandler00.setObject(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), myInvocationHandler00);
}

}

class HumanUtil
{
public void method00()
{
System.out.println("this is method 00");
}

public void method01()
{
System.out.println("this is mehtod 01");
}

}

public class TestAop
{
public static void main(String[] args)
{
SuperMan superMan = new SuperMan();
Human sm = (Human) MyProxy.getProxyInstance(superMan);
sm.fly();
sm.info();

NikeClothProduct nike = new NikeClothProduct();
ClothProduct product = (ClothProduct) MyProxy.getProxyInstance(nike);
product.product();

}

}
有错误之处,还请大家帮忙指教!3Q
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息