自定义注解
package com.shiwu;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogInput {
}
被代理的接口
package com.shiwu;
public interface BeCuteService {
@LogInput
public void demo(String str);
}
被代理接口实现 1
package com.shiwu;
public class BeCuteImpl implements BeCuteService{
//@Point
public void demo(String str){
System.out.println(str);
}
}
被代理接口实现 2
package com.shiwu;
public class BeCuteImpl2 implements BeCuteService{
@Override
public void demo(String str) {
System.out.println(str);
}
}
自动代理
package com.shiwu;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class AutoProxy implements InvocationHandler {
private Object target;
public AutoProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断方法是否有 LogInput注解
if (method.isAnnotationPresent(LogInput.class)) {
//日志打印
System.out.println("input param");
//执行
return method.invoke(target, args);
} else {
return method.invoke(target, args);
}
}
//通过反射,代理执行
public static void main(String[] args) {
Class aclass = null;
Object o = null;
try {
//反射
aclass = Class.forName("com.shiwu.BeCuteImpl2");
// 获取构造方法
Constructor constructor = aclass.getConstructor();
// 实例化被代理类
o = constructor.newInstance();
} catch (Exception e) {
throw new RuntimeException("NotFoundClass");
}
AutoProxy proxy = new AutoProxy(o);
// 构造代理
BeCuteService beCuteService =
(BeCuteService) Proxy.newProxyInstance(BeCuteService.class.getClassLoader(),
new Class<?>[]{BeCuteService.class}, proxy);
//执行
beCuteService.demo("hello");
}
}