cglib動態代理代碼示例
- 引用包cglib-xxx.jar
- 非Maven項目還需要手動引用包asm-xxx.jar
- 業務類(不需要定義接口)
- cglib代理類(實現接口MethodInterceptor)
1、業務類
package com.wzq.demo02;
/**
* 業務類
*
* 沒有實現接口
*
* 如果類是final的,則無法生成代理對象,報錯
*
* 如果方法是final的,代理無效
*
* @author Muscleape
*
*/
public class UserServiceImpl {
public void addUser() {
System.out.println("增加一個用戶。。。");
}
public void editUser() {
System.out.println("編輯一個用戶。。。");
}
}
2、cglib代理類,需要實現接口MethodInterceptor
package com.wzq.demo02;
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();
}
/**
* 實現MethodInterceptor接口中重寫的方法
*
* 回調方法
*/
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("事務開始。。。");
Object result = proxy.invokeSuper(object, args);
System.out.println("事務結束。。。");
return result;
}
}
3、測試類
package com.wzq.demo02;
public class TestCglib {
public static void main(String[] args) {
UserServiceCglib cglib = new UserServiceCglib();
UserServiceImpl bookFacedImpl = (UserServiceImpl) cglib.getInstance(new UserServiceImpl());
bookFacedImpl.addUser();
}
}
4、測試結果
事務開始。。。
增加一個用戶。。。
事務結束。。。
5、異常信息(項目只引用了cglib包,沒有引用asm包)
Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:72)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:72)
at com.wzq.demo02.UserServiceCglib.getInstance(UserServiceCglib.java:15)
at com.wzq.demo02.TestCglib.main(TestCglib.java:6)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 5 more
FATAL ERROR in native method: JDWP on checking for an array class, jvmtiError=JVMTI_ERROR_WRONG_PHASE(112)
JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on checking for an array class [util.c:1299]