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();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章