Java中动态生成一个接口的实现类(CGLib实现)
1.代码
/**
* 被实现的接口
*/
public interface MyService {
/**
* 有参数 无返回
*
* @param a a
*/
void doSomething(String a);
/**
* 多类型参数 有返回
*
* @param a a
* @param b b
* @return String
*/
String doSomething2(String a, Long b);
}
public static void main(String[] args) {
MyService myService = createProxy(
// 需要实现的接口
MyService.class,
// 设置方法拦截器
(MethodInterceptor) (obj, method, args1, proxy) -> {
System.out.println("方法执行前拦截 - " + method.getName());
try {
// 可以在这里添加前置处理
System.out.println("参数:" + Arrays.toString(args1));
// 这里可以决定是否执行实际方法
if (method.getName().equals("doSomething2")) {
// 生成一个长整型ID
long snowflakeNextId = IdUtil.getSnowflakeNextId();
// 或者返回自定义结果
return "doSomething2 方法返回值 :" + snowflakeNextId;
}
// 或者返回自定义结果
return null;
} finally {
System.out.println("方法执行后拦截 - " + method.getName());
}
});
myService.doSomething("hahaha");
String xixixi = myService.doSomething2("xixixi", 100L);
System.out.println("doSomething2 返回值 : " + xixixi);
}
/**
* Create Proxy
*
* @param interfaceClass interfaceClass
* @param callback callback
* @param <T> T
* @return <T>
*/
@SuppressWarnings("unchecked")
public static <T> T createProxy(Class<T> interfaceClass,
Callback callback) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Object.class);
enhancer.setInterfaces(new Class<?>[]{interfaceClass});
enhancer.setCallback(callback);
return (T) enhancer.create();
}
2.打印
方法执行前拦截 - doSomething 参数:[hahaha] 方法执行后拦截 - doSomething 方法执行前拦截 - doSomething2 参数:[xixixi, 100] 方法执行后拦截 - doSomething2 doSomething2 返回值 : doSomething2 方法返回值 :1941048989285089280

浙公网安备 33010602011771号