学习动态代理原理是为以后理解框架而必须的
需要注意的点:
接口:java.lang.reflect.InvocationHandler
方法:java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
重写方法:invoke
以下是有接口的情况,使用JDK代理(没有接口的情况使用CGLIB动态代理)
package com.du.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// ①==================基于Java接口实现动态代理==========================
class Proxyer implements InvocationHandler{
// 被代理对象
private Object o;
// 确定被代理对象
public Proxyer(Object o) {
this.o = o;
}
/**
* 类加载器
* 得到被代理对象的接口
* 代理对象实体类
* @return
*/
// 确定代理对象的实例
public Object bind(){
return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理之前执行的辅助方法!");
Object result=method.invoke(o, args);
System.out.println("代理之后执行的辅助方法!");
return result;
}
}
// ②==================被代理的业务==========================
interface Service{
void doService();
}
// ③===================被代理对象=========================
class Obj implements Service{
@Override
public void doService() {
System.out.println("主要执行的核心业务");
}
}
// ④===================测试执行=========================
public class MainTest{
public static void main(String[] args) {
Obj obj = new Obj();
Proxyer proxyer = new Proxyer(obj);
Service b = (Service) proxyer.bind();
b.doService();
}
}
代理之前执行的辅助方法!
主要执行的核心业务
代理之后执行的辅助方法!