1、Java.lang.reflect.Proxy类可以直接生成一个代理对象
proxy生成动态代理的实例 new InvocationHandler() 调用处理程序并返回一个结果
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数1:ClassLoader loader 代理对象的类加载器 一般使用被代理对象的类加载器
(表名你要用那个类加载器去加载生成的代理类。)
参数2:Class<?>[] interfaces 代理对象的要实现的接口 一般使用的被代理对象实现的接口
参数3:InvocationHandler (接口)执行处理类
InvocationHandler中的invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行
参数3.1:代理对象(慎用)
是生成的代理类,目前没发现用处,不管它。
参数3.2:当前执行的方法
参数3.3:当前执行的方法运行时传递过来的参数
返回值:当前方法执行的返回值
jdk默认的动态代理,如果真实对象没有实现任何的接口,是无法为他创建代理对象的
spring实现AOP功能,底层就是动态代理;
1)spring一句代码都不写的去创建动态代理
public class proxyTest {
public static void main(String[] args) {
//真实对象
ServiceImpl serviceImpl = new ServiceImpl();
//得到代理对象
Service s =(Service)
(这里不能是ServiceImpl应该是接口Service,否则ServiceImpl既是代理类也是被代理类, *代理对象和被带来对象是兄弟关系,不是父子关系)
Proxy.newProxyInstance(serviceImpl.getClass().getClassLoader(), serviceImpl.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("add")) {
System.out.println("++++c");
}
return method.invoke(serviceImpl, args);
}
});//生成代理类
s.add();
s.delete();
}
}