j2ee动态代理全面解析

来源:互联网 发布:找网络工作 编辑:程序博客网 时间:2024/04/29 18:34
/*****************************///>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 {@Overridepublic void exec() {System.out.println("myApp");}}//OtherApp模仿目标事件需要执行的目标代码class OtherApp implements App {@Overridepublic 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");}@Overridepublic 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);//返回truemethod.invoke(target, args);// 调用目标对象处理方法hackCodeEnd();// 目标对象代码执行之后植入的代码在spring中被称为(afterAdvice)return null;}}

原创粉丝点击