Java cglib 动态代理机制

上一篇讲过Java 的jdk动态代理机制 https://blog.csdn.net/k_young1997/article/details/91975889
它只能动态代理实现接口的类,如果没有实现接口,jdk是无法代理的。如果要实现类的动态代理可以使用cglib。
cglib 是一个强大的, 高效高质的代码生成库。

1、定义一个Programmer类

package demo;

public class Programmer {
	
	public void code() {
		System.out.println("I'm a Programmer,Just Coding.....");
	}
	
}

2、定义一个Hacker类,实现方法拦截器接口

package demo;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Hacker implements MethodInterceptor {

	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		//在方法调用之前,加入自己的代码
		System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");
		
		//调用代理的方法
		proxy.invokeSuper(obj, args);
		
		//在方法调用之后,加入自己的代码
		System.out.println("****  Oh,what a poor programmer.....");
		
		return null;
	}

}


3、生成动态代理对象,调用方法

package demo;

import net.sf.cglib.proxy.Enhancer;

public class Test {

	public static void main(String[] args) {
		
		Hacker hacker = new Hacker();
		
		//cglib 中 用来创建动态代理
		Enhancer enhancer = new Enhancer();
		
		//设置要创建动态代理的类
		enhancer.setSuperclass(Programmer.class);
		// 设置回调,对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实行intercept()方法进行拦截
		enhancer.setCallback(hacker);
		
		Programmer p = (Programmer) enhancer.create();
		
		p.code();
	}
}

cglib不仅能动态代理类,也可以动态代理接口,只需将 enhancer.setSuperclass() 换为 enhancer.setInterfaces(new Class[] {Interfaces.class}); 。 其中 new Class[] {} 为接口class对象的数组,在MethodInterceptor中根据自己的需要添加代码即可。

你可能感兴趣的:(java反射)