Jdk动态代理

来源:互联网 发布:linux网卡配置生效 编辑:程序博客网 时间:2024/06/05 18:34

1.什么是jdk动态代理

Java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。

2.jdk动态代理示例

     Jdk动态代理是必须要有接口,所以我们来定义一接口先,步骤如下。

   接口:

public interface IPerson {    public void doWork();}

   被代理类

public class Person implements IPerson {    @Override    public void doWork() {        System.out.println("要做的工作");    }}

    第一种方式实现动态代理(实现 InvocationHandler接口):

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class PersonProxy implements InvocationHandler {    private Person person = new Person();    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("之前做的操作");        method.invoke(person, args);        System.out.println("之后做的操作");        return null;    }}

    测试类的编写:

import java.lang.reflect.Proxy;import org.junit.Test;public class TestProxy {    @Test    public void testProsy() throws Exception {        Person person = new Person();        IPerson personPrxy = (IPerson) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass()                .getInterfaces(), new PersonProxy());        personPrxy.doWork();    }}
    输出结果:

     之前的工作
     要做的工作
     之后的工作

  

    第二种实现方式(使用匿名内部类来实现)

  

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class PersonProxy2 {    Person person = new Person();    @SuppressWarnings("unchecked")    public <T> T getProxyObject() {        //用泛型返回代理对象        return (T) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(),                new InvocationHandler() {                    @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                        System.out.println("之前的工作");                        person.doWork();                        System.out.println("之后的工作");                        return null;                    }                });    }}

    测试代码:

import org.junit.Test;public class TestProxy2 {    @Test    public void testProsy2() throws Exception {        IPerson personProxy = new PersonProxy2().getProxyObject();        personProxy.doWork();    }}
   输出结果:

     之前的工作
     要做的工作
     之后的工作



原创粉丝点击