Java学习day44-java动态代理

一、Java动态代理

1.Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态的生成实现类。

2.创建一个动态代理类所对应的Class对象:

  static Object newProxyinstance(ClassLoader,Class<?>[] Interfaces,InvocationHandler h) 直接创建一个动态代理对象

二、实例

1.先给类创建一个接口

package day19;

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

2.再创建一个类实现接口

package day19;

public class TestDemoImpl implements ITestDemo {

    public void test1() {
        // TODO Auto-generated method stub
        System.out.println("执行test1方法");
    }

    public void test2() {
        // TODO Auto-generated method stub
        System.out.println("执行test2方法");
    }

}

3.创建动态代理类

package day19;

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

/**
 * 动态代理类
 * */
public class ProxyDemo implements InvocationHandler{
    
    Object obj;//被代理的对象
    
    public ProxyDemo(Object obj){
        this.obj = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        
        System.out.println(method.getName() + " 方法开始执行");
        
        Object result = method.invoke(this.obj, args);//执行的是代理对象的指定的方法
        
        System.out.println(method.getName() + " 方法执行结束");
        return null;
    }
    
}

四、测试实现动态代理

package day19;

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

public class Test2 {
    public static void main(String[] args){
        ITestDemo test = new TestDemoImpl();
        /**
         * 注意:如果一个对象想要通过Proxy.newProxyInstance方法被代理,
         * 那么这个对象的类一定要有相应的接口
         * 就像本类中的ITestDemo接口和实现类TestDemoImpl
         * */
        test.test1();
        test.test2();
        System.out.println("==================================");
        /**
         * 需求:在执行test1和test2方法时需加入一些东西
         * 1.在执行方法前打印test1或test2开始执行
         * 2.在执行方法后打印test1或test2执行完毕
         * 打印的方法名要和当时调用的方法保持一致
         * */
        
        InvocationHandler handler = new ProxyDemo(test);
        
        /**
         * Proxy.newProxyInstance(ClassLoader(), interfaces, h)
         * 参数1是代理对象的类加载器
         * 参数2是被代理的对象的接口
         * 参数3是代理对象
         * 
         * 返回的值就是成功被代理后的对象,返回的是Object类型,需要根据当时的情况去转换类型
         * */
        ITestDemo t = (ITestDemo)Proxy.newProxyInstance(handler.getClass().getClassLoader(), test.getClass().getInterfaces(), handler);
        
        t.test1();
        System.out.println("----------------------------------");
        t.test2();
    }
}

打印结果:

posted @ 2020-04-03 16:02  苏胖胖  阅读(167)  评论(0)    收藏  举报