Cglib字节码增强

①首先添加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效率更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值