• Java反射机制


    Java反射机制

    程序可以访问,检测和修改本身状态或行为的能力。

    类的组成:

    • 成员变量
    • 方法
    • 构造方法

    发射机制的功能:

    • 运行时判断任意一个对象所属的类
    • 运行时构造任意一个类的对象
    • 运行时判断任意一个类所具有的成员变量和方法
    • 运行时调用任意一个对象的方法
    • 生成动态代理

    相关API

    通过一个对象获得完整的包名和类名

    动态绑定

    interface Animal{
        void eat();
        void walk();
    }
    
    class Dog implements Animal{
        @Override
        public void eat() {
            System.out.println("Dog is eating!");
        }
        @Override
        public void walk() {
            System.out.println("Dog is walking!");
        }
    }
    
    class Cat implements Animal{
        @Override
        public void eat() {
            System.out.println("Cat is eating!");
        }
        @Override
        public void walk() {
            System.out.println("Cat is walking!");
        }
    }
    
    // 代理类
    // 1. 方式一
    class AnimalProxy implements InvocationHandler{
        private Object target;
        public AnimalProxy(Object target){
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Invoke AnimalProxy");
            Object res = method.invoke(target, args);
            return res;
        }
    }
    
    // 2. 方式二
    class newAnimalProxy implements InvocationHandler{
        private Object target;
        public Object bind(Object target){
            this.target = target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterface(),this);
        }
    }
    
    // 1. 方式一代理测试
    @Test
    public void test(){
        // 代理Dog类
        Animal dog = new Dog();
        Animal proxy = (Animal)Proxy.newProxyInstance(dog.getClass().getClassLoader(),dog.getClass().getInterface(),new AnimalProxy(dog));
        proxy.eat();
        proxy.walk();
    
        // 代理Cat类
        Animal cat = new Cat();
        Animal proxy = (Animal)Proxy.newProxyInstance(cat.getClass().getClassLoader(),cat.getClass().getInterface(),new AnimalProxy(cat));
        proxy.eat();
        proxy.walk();
    }
    
    // 2. 方式二代理测试
    @Test
    public void newTest(){
        newAnimalProxy proxy = new newAnimalProxy(); // 创建代理类
        Animal getDog = (Animal)proxy.bind(new Dog()); // 绑定需要代理的对象(使用接口类)
        getDog.eat(); // 调用对象方法
        getDog.walk();
    }
    
  • 相关阅读:
    Elasticsearch的介绍与安装配置启动问题
    代码发布项目
    gitpython模块
    Paramiko模块
    gojs插件的介绍与使用
    django中如何实现websocket,真正通过websocket实现群聊功能
    如何实现服务端主动给客户端推送消息,websocket详解,以及django如何使用websocket问题
    简单爬取汽车之家新闻(requests模块+bs4)
    http协议版本,响应状态码,正反向代理的区别,与伪静态
    web开发经验——富头像上传编辑器的使用
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13217301.html
Copyright © 2020-2023  润新知