关于cglib代理的概念和原理以及常用api,请参考:
InvocationHandler可以实现对接口的代理,类似与mybatis,代码中开发者只需要写一个接口和一个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,参数的解析、sql的生成、发送、结果集的封装等都不用开发者去写。而其中的原理就是利用了代理模式。cglib对此有很好的实现方案。
首先定义一个接口,这个接口里有各种返回值类型的方法。
import java.util.List;
public interface TestInterface {
String testString(Integer id);
int testInt(String value);
List testList(Integer age,Integer g);
SampleClass testSampleClass();
}
用代理模式去实现这些方法。实现类交由cglib去动态创建。
import net.sf.cglib.proxy.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class test2 {
public static void main(String[] args) {
Class[] classes = {TestInterface.class};
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(classes);
CallbackHelper callbackHelper = new CallbackHelper(Object.class, classes) {
@Override
protected Object getCallback(Method method) {
// 只代理TestInterface中的方法
if(method.getDeclaringClass() == TestInterface.class){
return new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.print("参数:");
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
Class<?> returnType = method.getReturnType();
if (returnType == int.class || returnType == Integer.class) {
// 返回值类型是整数类型
return 1;
}else if(returnType == String.class){
// 返回值类型是字符串
return "string";
}else if(returnType == List.class){
// 返回值类型是集合
ArrayList arrayList = new ArrayList();
arrayList.add("11");
return arrayList;
}
// ... 等等
else{
// 自定义类型
return returnType.newInstance();
}
}
};
}else{
// 什么都不做
return NoOp.INSTANCE;
}
}
};
enhancer.setCallbackFilter(callbackHelper);
enhancer.setCallbacks(callbackHelper.getCallbacks());
TestInterface proxy = (TestInterface) enhancer.create();
System.out.println("返回值:"+proxy.testInt("123"));;
System.out.println("返回值:"+proxy.testList(1,1));;
System.out.println("返回值:"+proxy.testString(1));;
System.out.println("返回值:"+proxy.testSampleClass());;
}
}