JDK动态代理的原理

资料来源于网上

JDK动态代理实际上是生成一个新的类,将增强和被代理类方法的代码加入到新的类中。注意JDK动态代理需要被代理类实现接口。

原理:

1.拿到被代理类的引用,并且获取它的所有的接口(反射获取)

2.JDK Proxy类重新生成一个新的类,实现了被代理类的所有接口的方法。

3.动态生成JAVA代码,把增强逻辑加入到新生成代码中。

4.编译生成新的JAVA代码的class文件。

5.加载并重新运行新的class,得到的类就是全新的类。

动态代理处理器:

package com.example.scheduled.designModel.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKMeipo implements InvocationHandler {

    private Object target;

    public Object getInsnstance(Object person) throws Exception{
        this.target=person;
        Class clazz=target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }



    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object obj=method.invoke(this.target,args);
        after();
        return obj;
    }

    private void after() {
        System.out.println("after");
    }

    private void before() {
        System.out.println("before");
    }
}

被代理类:

package com.example.scheduled.designModel.proxy;

public class Girl implements Person {
    @Override
    public int findLove() {
        System.out.println("高富帅");
        return 0;
    }
}

被代理类要实现的接口:

package com.example.scheduled.designModel.proxy;

public interface Person {

    public abstract int findLove();
}

测试方法:

package com.example.scheduled.designModel.proxy;

public class JDKProxyTest {

    public static void main(String[] args){
        try {
            Person obj=(Person) new JDKMeipo().getInsnstance(new Girl());
            obj.findLove();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

你可能感兴趣的:(java)