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

  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一定要实现接口。

 

  

    

 

posted @ 2018-07-13 17:18  飘渺红尘✨  阅读(10661)  评论(1编辑  收藏  举报
Title