第一步:声明接口及方法
public interface IDynamicProxy {
void print();
}
第二步:实现接口
/**
* @Description:
* @Author Be.insighted
* @Date 2022/4/29 15:14
*/
@Slf4j
public class DynamicProxyImpl implements IDynamicProxy{
@Override
public void print() {
log.info("代理类实现打印!");
}
}
第三步:使用JDK的接口
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Description:
* @Author Be.insighted
* @Date 2022/4/29 15:21
*/
@Slf4j
public class DynamicProxy {
public static Object getInstance(final IDynamicProxy object){
return Proxy.newProxyInstance(IDynamicProxy.class.getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
/**
*
* @param proxy 代理对象
* @param method 方法
* @param args 方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log.info(method.getName()+" 开始执行!");
Object invoke = method.invoke(object,args);
log.info(method.getName()+" 执行结束!");
return invoke;
}
});
}
public static void main(String[] args) {
IDynamicProxy proxy = new DynamicProxyImpl();
IDynamicProxy instance = (IDynamicProxy) DynamicProxy.getInstance(proxy);
instance.print();
}
}
- 参数1:接口类的类加载器:
- 参数2:接口类 object.getClass().getInterfaces() 《=== 获取对象的所有接口
- 参数3:调用处理器
getInterfaces方法在java反射中的作用是:获取对象的所有接口。而在测试的过程中(main方法内),给getInstance()方法传的是实现接口的对象,提供了接口的信息,符合要求。
?
|