①首先添加jar包:
spring-core-4.3.18.RELEASE.jar
②不需要接口,只需要是实现类
package com.spring.jdkTest;
//接口
public interface Iuser {
void printOne();
void printTwo();
}
package com.spring.jdkTest;
//目标类
public class UserImpl implements Iuser {
@Override
//连接点
public void printOne() {
System.out.println("One");
}
@Override
//连接点
public void printTwo() {
System.out.println("Two");
}
}
package com.spring.proxy;
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.core.MethodInfoTransformer;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.core.MethodIntrospector;
import com.spring.advice.Advice;
import com.spring.jdkTest.Iuser;
import com.spring.jdkTest.UserImpl;
public class MyProxy {
// cglib不需要接口,只需要是实现类
public static UserImpl getIuser() {
Iuser user = new UserImpl();
Advice advice = new Advice();
// 获得一个对象
Enhancer enhancer = new Enhancer();
// 1.设置父类
enhancer.setSuperclass(user.getClass());
// 2.设置回调函数,里面涵盖invoke方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method m, Object[] arr, MethodProxy arg3) throws Throwable {
// TODO 自动生成的方法存根
advice.before();
// 执行目标类方法
Object obj = m.invoke(user, arr);
advice.after();
return obj;
}
});
// 3.产生代理对象
UserImpl userImplProxy = (UserImpl) enhancer.create();
return userImplProxy;
}
}
package com.spring.jdkTest;
import org.junit.Test;
import com.spring.proxy.MyProxy;
public class SpringTest {
@Test
public void test() {
UserImpl user = MyProxy.getIuser();
user.printOne();
user.printTwo();
}
}
前
One
后
前
Two
后
⭐Jdk动态代理和cglib字节码增强选择哪个比较好?
System.out.print(“前”) 会生成一个class文件(字节码)
Printone();也会生成一个class文件(字节码)
Jdk动态代理只能在运行的时候把字节码往里面放,而cglib在编译的时候把增强方法往里面放,和目标方法一起编译运行,字节码文件变多。
总结:jdk动态代理比cglib效率更高