67,515
社区成员
发帖
与我相关
我的任务
分享
package org.aop;
public interface Target
{
void doSomething();
}
///////////////
package org.aop;
public class MyTarget implements Target
{
@Override
public void doSomething()
{
System.out.println("doSomething^^^^^^");
}
}
///////////////////
package org.aop;
public class MyInterceptor
{
public void doBefore()
{
System.out.println("before++++++++++++++++");
}
public void doAfter()
{
System.out.println("after------------------");
}
}
///////////////////////////
package org.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler
{
private Target target;
public MyHandler(Target target)
{
this.target = target;
}
private MyInterceptor myInterceptor = new MyInterceptor();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
myInterceptor.doBefore();
Object res = method.invoke(target, args);
myInterceptor.doAfter();
return res;
}
}
////////////////////////
package org.aop;
import java.lang.reflect.Proxy;
public class MyProxy
{
public Target getProxy(Target obj)
{
Target target = new MyTarget();
MyHandler handler = new MyHandler(target);
return (Target) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
}
}
///////////////////////////////
package org.aop;
public class Client
{
public static void main(String[] args)
{
Target target = new MyTarget();
MyProxy myProxy = new MyProxy();
Target proxy = myProxy.getProxy(target);
proxy.doSomething();
}
}
public class ObjectDynamicProxy implements InvocationHandler{
//真实对象引入
private Object proxyObj;
public void setObj(Object obj) {
this.proxyObj = obj;
}
public ObjectDynamicProxy(Object obj){
this.proxyObj = obj;
}
public Object invoke(Object object, Method method, Object[] args)
throws Throwable {
System.out.println("before dynamic proxy method.");
Object obj = method.invoke(proxyObj, args);
System.out.println("after dynamic proxy method.");
return obj;
}
/**
* 代理对象生产工厂
* @param obj
* @return
*/
public static Object factory(Object obj) {
//获取传入对象的Class对象
Class<?> classType = obj.getClass();
//生成代理对象并返回
//该对象实现传入对象所实现的接口
//生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用
return Proxy.newProxyInstance(classType.getClassLoader(), classType
.getInterfaces(), new ObjectDynamicProxy(obj));
}
}