1. 程式人生 > 其它 >SSH前言 - 動態代理的簡單實現

SSH前言 - 動態代理的簡單實現

技術標籤:Struts2+Spring+Hibernatessh反射動態代理

動態代理:程式執行後代理類與目標類之間的代理關係隨之確定,動態代理一般僅具備代理物件。

介面類:

/**
 * 主業務介面:本介面中的方法將會被代理增強
 * @author WanAkiko
 *
 */
public interface ISomeService {

	String doFirst();
	
	void doSecond();
	
}

介面實現類:

import service.ISomeService;

/**
 * 目標類:本類將會被代理類增強
 * @author WanAkiko
 *
 */
public class SomeServiceImpl implements ISomeService {

	@Override
	public String doFirst() {
		System.out.println("執行目標類的doFirst方法!");
		return "WanAkiko";
	}

	@Override
	public void doSecond() {
		System.out.println("執行目標類的doSecond方法!");
	}

}

功能測試類(此處動態代理僅具備代理物件而不具備具體的代理類):

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import service.ISomeService;
import service.impl.SomeServiceImpl;

/**
 * 功能測試類
 * 
 * @author WanAkiko
 * 
 */
public class DynamicProxyTest {

	public static void main(String[] args) {
		final ISomeService target = new SomeServiceImpl();
		// 主業務介面例項化靜態代理類
		/**
		 * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
		 * 返回一個指定介面的代理類例項(動態代理物件),該介面可以將方法呼叫指派到指定的呼叫處理程式
		 */
		ISomeService service = (ISomeService) Proxy.newProxyInstance(
				target.getClass().getClassLoader(), // 獲取目標類的類載入器
				target.getClass().getInterfaces(), // 獲取目標類實現的所有介面
				new InvocationHandler() { // 建立InvocationHandler匿名內部類
					/**
					 * Object proxy:代理物件
					 * Method method:需要增強的目標方法 
					 * Object[] args:目標方法的引數列表
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						Object result = method.invoke(target, args);
						if (null != result) {
							((String) result).toUpperCase();
						}
						return result;
					}
				});
		String result = service.doFirst();
		System.out.println(result);
		// 此處doSecond()在程式執行時執行到invoke()後會丟擲空指標異常,原因是該方法沒有返回值
		service.doSecond();
	}

}

執行示例:
在這裡插入圖片描述

在這裡插入圖片描述