(原)Java動態代理實現(簡單AOP實現)

本文介紹了簡單Aop實現的方法,意在拋磚引玉。

首先是簡單的Aspect接口
package org.aspect;

/**
* 切面接口
*/
public interface Aspect {

/**
* 事先執行
*/
public void doBefore();

/**
* 事後執行
*/
public void doAfter();
}


然後是代理工廠
package org.aspect;

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
* 代理工廠類
*/
public class DynamicProxyFactory {

/**
* 私有構造方法
*/
private DynamicProxyFactory() {}

/**
* 工廠方法
*
* @param instance 代理目標類實例對象
* @param aspect 切面對象
*/
public static Object newInstance(Object instance, Aspect aspect) {

List<Aspect> aspectList = new ArrayList<Aspect>();
aspectList.add(aspect);

return newInstance(instance, aspectList);
}

/**
* 工廠方法
*
* @param instance 代理目標類實例對象
* @param aspectList 切面集合
*/
public static Object newInstance(Object instance, List<Aspect> aspectList) {
SimpleInvocationHandler hander = new SimpleInvocationHandler();
hander.setAspectList(aspectList);
hander.setSource(instance);
return Proxy.newProxyInstance(instance.getClass().getClassLoader(),
instance.getClass().getInterfaces(),
hander);
}
}


最後是代理執行類
package org.aspect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;

/**
* 代理委託接口實現
*/
public class SimpleInvocationHandler implements InvocationHandler {


private Object source = null;

private List<Aspect> aspectList = null;


public Object getSource() {
return source;
}


public void setSource(Object source) {
this.source = source;
}


public List<Aspect> getAspectList() {
return aspectList;
}


public void setAspectList(List<Aspect> aspectList) {
this.aspectList = aspectList;
}

/**
* 委託方法
*
* @param proxy 代理對象
* @param method 代理方法
* @param args 方法參數
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

for (Aspect aspect : aspectList) {
aspect.doBefore();
}

Object retObj = method.invoke(getSource(), args);

for (int index = aspectList.size() - 1; index >= 0; index--) {
aspectList.get(index).doAfter();
}

return retObj;
}

}


測試代碼

public interface Student {
public void sayHello();
}

import org.aspect.Aspect;

public class StudentAspectOne implements Aspect {

@Override
public void doAfter() {
System.out.println("do After One");

}

@Override
public void doBefore() {
System.out.println("do Before One");

}

}

import org.aspect.Aspect;


public class StudentAspectTwo implements Aspect{
@Override
public void doAfter() {
System.out.println("do After Two");

}

@Override
public void doBefore() {
System.out.println("do Before Two");

}
}

public class StudentImpl implements Student {

@Override
public void sayHello() {
System.out.println("Student");
}

}

import java.util.ArrayList;
import java.util.List;

import org.aspect.Aspect;
import org.aspect.DynamicProxyFactory;

public class Test {

public static void main(String[] args) {

List<Aspect> aspectList = new ArrayList<Aspect>();

aspectList.add(new StudentAspectOne());
aspectList.add(new StudentAspectTwo());
Student s = (Student)DynamicProxyFactory.newInstance(new StudentImpl(), aspectList);
s.sayHello();
}

}



執行Test,控制檯返回

do Before One
do Before Two
Student
do After Two
do After One
發佈了12 篇原創文章 · 獲贊 1 · 訪問量 2532
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章