/*****************************/
//>JDK1.5动态代理实例
/*****************************/
//0.概述动态代理
//动态代理的功能主要是进行横向抽取代码,不像面向对象纵向抽取代码
//所谓横向抽取代码为抽取方法中的冗余和共通性代码,能够起到灵活维护方便的特点,
//但是在jdk中自带的代理方式只允许通过目标对象和代理对象实现同一接口的方式进行代理
package com.zyb.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException, InstantiationException {
Hacker hacker = new Hacker();
hacker.setTarget(new MyApp());// 在执行代码前必须进行手动植入
Class[] interfaces = new Class[] { App.class };
App proxy = (App) Proxy.newProxyInstance(TestProxy.class.getClassLoader(), interfaces, hacker);
proxy.exec();
}
}
interface App {
void exec();
}
// MyApp模仿目标事件需要执行的目标代码
class MyApp implements App {
@Override
public void exec() {
System.out.println("myApp");
}
}
//OtherApp模仿目标事件需要执行的目标代码
class OtherApp implements App {
@Override
public void exec() {
System.out.println("OtherApp");
}
}
class Hacker implements InvocationHandler {
private Object target;// 处理目标事件的对象(目标对象)
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
// 方法中的共通性代码(即需要植入到目标对象中的代码)
public void hackCodeStart() {
System.out.println("hacker code start");
}
// 方法中的共通性代码(即需要植入到目标对象中的代码)
public void hackCodeEnd() {
System.out.println("hacker code end");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
hackCodeStart();// 目标对象代码执行之前植入代码(beforeAdvice)
// Proxy p = (Proxy)proxy; //proxy对象为实现了invocationHandler接口的实例对象
// InvocationHandler handler = p.getInvocationHandler(proxy);
// Hacker h = (Hacker)handler;
// System.out.println(h==this);//返回true
method.invoke(target, args);// 调用目标对象处理方法
hackCodeEnd();// 目标对象代码执行之后植入的代码在spring中被称为(afterAdvice)
return null;
}
}
j2ee动态代理全面解析
最新推荐文章于 2020-03-21 00:47:11 发布