概述
是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。它是第三方实现的,所以需要导入jar
包。
特点
和JDK提供的动态代理相比,Cglib更加灵活,不需要类上存在接口,因为它生成代理对象是通过现有的类派生出一个子类,在子类中加入我们新的条件。所以被代理的类不能使用final修饰。
使用的例子
public interface UserDao {
void save();
}
import org.springframework.beans.factory.annotation.Value;
public class UserDaoImpl implements UserDao {
@Value("HelloWorld")
private String name;
public void save() { System.out.println("保存..."); }
public void talk() {
System.out.println("接口中没有我");
}
public String toString() {
return "UserDaoImpl [name=" + name + "]";
}
}
import java.lang.reflect.Method;
import com.spring.secondday.UserDao;
import com.spring.secondday.UserDaoImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy {
private UserDao ud;
public CglibProxy(UserDao ud) {
this.ud = ud;
}
public UserDaoImpl getProxy(){
Enhancer en = new Enhancer();
en.setSuperclass(ud.getClass());
en.setCallback(new MethodInterceptor() {
//proxy:被代理的对象 m:被增强的方法 args:方法所需的参数 methodProxy:增强后的方法
public Object intercept(Object proxy, Method m, Object[] args, MethodProxy methodProxy)
throws Throwable {
System.out.println("before");
Object super1 = methodProxy.invokeSuper(proxy, args);
System.out.println("after");
return super1;
}
});
UserDaoImpl proxy = (UserDaoImpl)en.create();
return proxy;
}
public static void main(String[] args) {
UserDaoImpl ud = new UserDaoImpl();
UserDaoImpl proxy = new CglibProxy(ud).getProxy();
/*Console:
before
接口中没有我
after */
proxy.talk();
}
}