JDK动态代理(Proxy)的两种实现方式

纵然是瞬间 提交于 2020-03-21 16:38:49

3 月,跳不动了?>>>

JDK自带的Proxy动态代理两种实现方式

  

  前提条件:JDK Proxy必须实现对象接口

  so,创建一个接口文件,一个实现接口对象,一个动态代理文件

  接口文件:TargetInterface.java

      

复制代码
package proxy;

public interface TargetInterface {
    public String method1();
    public void method2();
    public int method3(int x);
}
复制代码

 

  实现接口对象的Class文件:Target.java

  

复制代码
package proxy;

public class Target implements TargetInterface{

    @Override
    public String method1() {
        // TODO Auto-generated method stub
        System.out.println("method1 running...");
        return "aaa";
    }

    @Override
    public void method2() {
        // TODO Auto-generated method stub
        System.out.println("method2 running...");
    }

    @Override
    public int method3(int x) {
        // TODO Auto-generated method stub
        return x;
    }

}
复制代码

 

  动态代理的两种实现方式

    1.ProxyTest.java

    

复制代码
package proxy;

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

import org.junit.Test;

public class ProxyTest {
    @Test
    public void test1() {
        TargetInterface newProxyInstance = (TargetInterface) Proxy.newProxyInstance(
                Target.class.getClassLoader(), 
                new Class[] {TargetInterface.class},
                new InvocationHandler() {
                    //invoke 代表的是执行代理对象的方法
                    @Override
                    //method:代表目标对象的方法字节码对象
                    //args:代表目标对象的响应的方法的参数
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // TODO Auto-generated method stub
                        Object invoke = method.invoke(new Target(), args);
                        return invoke;
                    }
                });
        
        String method1 = newProxyInstance.method1();
        newProxyInstance.method2();
        int method3 = newProxyInstance.method3(100);
        System.out.println(method1);
        System.out.println(method3);
    }
}
复制代码

 

  2.ProxyTest2.java

    

复制代码
package proxy;

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

import org.junit.Test;

public class ProxyTest2 {
    
    public static void main(String[] args) {
        Target target = new Target();
        TargetInterface newProxyInstance = (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //反射知识点
                        Object invoke = method.invoke(target, args);
                        return invoke;
                    }
                });
        String method1 = newProxyInstance.method1();
        newProxyInstance.method2();
        int method3 = newProxyInstance.method3(100);
        System.out.println(method1);
        System.out.println(method3);
    }

}
复制代码

  运行结果都如下所示:

  

总结下重要的就是:

1.熟练Proxy.newProxyInstance的使用

2.JDK的Proxy一定要实现接口。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!