JDK动态代理简单实现

创建交通工具接口:Vehicle

package proxy;

public interface Vehicle {
    void drive();
} 

创建充电接口:Rechargable

package proxy;

public interface Rechargable {
    void recharge();
}

创建电动车实现类:ElectricCar

package proxy;

public class ElectricCar implements Rechargable, Vehicle {
  
    @Override  
    public void drive() {  
        System.out.println("电动车跑起来了!!!");
    }  
  
    @Override  
    public void recharge() {  
        System.out.println("电动车正在充电!!!");
    }  
  
}  

创建测试类:Test

package proxy;

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

/**
 * @ClassName Test
 * @Description TODO
 * @Date 2019/8/6 9:16
 * @Created by sunyiwei
 */
public class Test {
    public static void main(String[] args){
        ElectricCar car = new ElectricCar();
        // 1.获取对应的ClassLoader
        ClassLoader classLoader = car.getClass().getClassLoader();
        // 2.获取ElectricCar 所实现的所有接口
        Class[] interfaces = car.getClass().getInterfaces();
        /*
          3.根据上面提供的信息,创建代理对象 在这个过程中,
                 a.JDK会通过根据传入的参数信息动态地在内存中创建和.class 文件等同的字节码
                 b.然后根据相应的字节码转换成对应的class,
                 c.然后调用newInstance()创建实例
         */

        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("将要调用 " + method.getName() + " 方法!!!");
                method.invoke(car);
                System.out.println(method.getName() + " 调用完成!!!");
                return null;
            }
        });
        Vehicle vehicle = (Vehicle) proxy;
        vehicle.drive();
        Rechargable rechargable = (Rechargable) proxy;
        rechargable.recharge();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陈阿飞阅读 4,413评论 1 1
  • 比代理模式更强大的是我们只需要定义接口,用动态代理类当做动态实现接口 mybatis mapper接口的实现htt...
    hehehehe阅读 1,657评论 0 0
  • 最近常常看到一些资料时,是不是会看到动态代理,但是在项目中却好像没怎么使用过动态代理,所以对动态代理的理解...
    Android开发_Hua阅读 7,724评论 0 2
  • 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原...
    米刀灵阅读 1,396评论 0 0
  • 基础:class文件简介及加载流程 Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种cl...
    jiangmo阅读 3,318评论 0 1

友情链接更多精彩内容