j2ee动态代理全面解析

/*****************************/
//>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;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值