陣列的快速排序
阿新 • • 發佈:2020-12-31
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修飾的類