1、定义注解:CherryAnnotation
2、注解逻辑:HelloServiceCgLib
3、使用注解
import java.lang.annotation.*;
//@CherryAnnotation被限定只能使用在类、接口或方法上面
@Documented
@Inherited
@Target(value = {ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CherryAnnotation {
String value() default "参数不能为空";
}
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class HelloServiceCgLib implements MethodInterceptor {
private Class target;
public Object getInstance(Class target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object object, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
// System.out.println("我是CGLIB的动态代理");
// System.out.println("我准备执行了");
if (!check(method,objects)) {
// System.out.println("我没能成功执行");
return false;
}
Object returnObj = proxy.invokeSuper(object, objects);
// System.out.println("我已经正确执行过了");
return returnObj;
}
/**
* 对参数校验的方法
* @param method 目标方法
* @param objects 相关参数值
* @return
*/
public boolean check(Method method,Object[] objects) {
Parameter[] parameters = method.getParameters();
for (int i = 0; i <parameters.length; i++) {
Parameter parameter = parameters[i];
if (parameter.isAnnotationPresent(CherryAnnotation.class)) {
CherryAnnotation annotation = parameter.getAnnotation(CherryAnnotation.class);
if (objects==null ||objects[i]==null) {
System.out.println(parameter.getName()+annotation.value());
return false;
}else if(objects[i]=="zs"){
System.out.println(parameter.getName()+"不可以是张三");
return false;
}
}
}
return true;
}
}
public class use_zhujie {
public void say(@CherryAnnotation String name, @CherryAnnotation String pass){
System.out.println("ok");
}
}