jdk中的动态代理

时间:2021-07-24 11:11:56

前言:Java中的动态代理是面向切面编程(AOP)的基础或者说是具体的形式,我们就来了解jdk中的动态代理的基本实现原理吧

使用的关键API为java.lang.reflect.Proxy

1.创建一个接口

public interface Eatable {
public void eat();
}

2.创建实现该接口的类

public class Person implements Eatable {
@Override
public void eat() {
System.out.println("我特别能吃");
}
}

以上就是要被代理的接口及其具体类,然后我们查阅jdkAPI中的java.lang.reflect.Proxy
Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
它会为指定的接口(Eatable)中进行方法执行并通过执行器处理器(InvocationHandler)为实现该接口的类(Person)覆盖方法(Person.eat())进行代理进行代理,并返回代理对象(Proxy Instance),所以我们接下来这样做:

3.创建实现InvocationHandler的执行器处理器

public class proxyDemo implements InvocationHandler {

private Object obj;

public void setObj(Object obj) {
this.obj = obj;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("有句话不知当讲不当讲");
Object result = method.invoke(obj, args);
System.out.println("我厉害吧?");
return result;
}
}


 
 

其中:obj属性为代理的对象,invoke方法中的形参Method为该obj类实现接口中的方法,

4.最后,在测试代码中这样写

		proxyFactory demo = new proxyFactory();
Person person = new Person();
demo.setObj(person);
Eatable proxy = (Eatable) Proxy.newProxyInstance(person.getClass().getClassLoader(),
person.getClass().getInterfaces(), demo);
proxy.eat();


执行器处理器demo接收被代理对象person,Proxy.newInstance(...)的静态方法生接收person的类加载器,实现的接口interfaces生成实现了interfaces的代理对象,并交给demo进行具体的回调处理(demo.invoke(...)),最后返回该代理对象。

5.我们执行代码,结果如下:

jdk中的动态代理