Java动态代理(1)

在这里插入图片描述
实现:
新建ITestDemo接口

package com.study.javastu3;

public interface ITestDemo {
    public void test();
    public void test1();
}

用ProxyDemo类实现ITestDemo接口

package com.study.javastu3;

public class TestDemoImpl implements  ITestDemo{
    @Override
    public void test() {
        System.out.println("执行test 0");
    }

    @Override
    public void test1() {
        System.out.println("执行test 1");
    }
}

实现InvocationHandler的代理类 ProxyDemo

package com.study.javastu3;

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

/*
动态代理类
 */
public class ProxyDemo implements InvocationHandler {
    Object obj;//被代理的对象
    public ProxyDemo(Object obj){
        this.obj = obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName()+" 方法开始执行!");
        Object obj = method.invoke(this.obj,args);       //执行代理对象的指定方法
        System.out.println(method.getName()+" 方法结束执行!");
        return obj;
    }
}

测试:

package com.study.javastu3;

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

public class Test2 {
    public static void main(String[] args)
    {
        /**
         * 如果一个对象想要通过Proxy.newProxyInstance()方法被代理,
         * 那么这个类中的类必须要有接口
         * 就像本类的TestDemoImpl有ITestDemo接口
         */
        ITestDemo test = new TestDemoImpl();
        test.test();
        test.test1();
        // 需求,在执行test1和test2方法时,需要在执行之前打印test1或者test2开始执行,
        // 在执行方法后,打印test1或者test2方法结束,打印的方法名要和当时调用的方法名一致
        InvocationHandler handler = new ProxyDemo(test);
        // Proxy.newProxyInstance(,,)
        // 有三个参数,参数1是代理对象的类加载器,参数2是被代理对象的接口,参数3是代理对象
        //返回的值就是成功代理后返回的对象,返回的值是Object类型,需要根据情况进行强转
        ITestDemo t = (ITestDemo) Proxy.newProxyInstance(handler.getClass().getClassLoader(),test.getClass().getInterfaces(),handler);
        t.test();
        t.test1();
    }
}
/*  测试结果
执行test 0
执行test 1
test 方法开始执行!
执行test 0
test 方法结束执行!
test1 方法开始执行!
执行test 1
test1 方法结束执行!
*/



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