1. 程式人生 > 其它 >陣列的快速排序

陣列的快速排序

技術標籤:proxyjava

CGLIB動態代理

CGLIB通過ASM動態操作指令,生成了被代理類的子類,如果目標類是final修飾的,則不能夠被代理。
CGLIB生成的代理物件,其實是目標物件的子型別物件,並重寫了目標類中所有的非private、非final的方法,從而完成這些方法的代理工作。

1、專案中引入jar包(cglib和asm)

(可以到官網上去下載不同版本)
asm-7.1jar
cglib-3.3.0.jar
在這裡插入圖片描述

2.目標類

package com.briup.cglib;
/**
 * 目標類
 * 沒有實現介面
 * 如果方法是final,private修飾的代理無效
 * @author Administrator
 *
 */
public class UserService { public void addUser() { System.out.println("增加一個使用者"); } public void deleteUser() { System.out.println("刪除一個使用者"); } final public void run() { System.out.println("final修飾的類"); } //產生異常 //throw new RuntimeException();
}

3.cglib代理類

package com.briup.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class UserServiceCglib implements MethodInterceptor{

	private Object target;
	
	public Object getInstance
(Object target) { this.target=target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); //設定回撥方法 enhancer.setCallback(this); //建立代理物件 return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事務開始"); Object result = null; try { result = proxy.invokeSuper(obj, args); System.out.println("提交事務"); } catch (Exception e) { //發生異常則回滾事務 e.printStackTrace(); System.out.println("回滾事務"); } return result; } }

4.測試類

package com.briup.cglib;

public class UserCglibTest {
	public static void main(String[] args) {
		UserServiceCglib cglib = new UserServiceCglib();
		UserService userService = (com.briup.cglib.UserService) cglib.getInstance(new UserService());
		userService.addUser();
		System.out.println("***********");
		userService.deleteUser();
		System.out.println("***********");
		//無代理
		userService.run();
	}
}

結果:
事務開始
增加一個使用者
提交事務


事務開始
刪除一個使用者
提交事務


final修飾的類