zoukankan      html  css  js  c++  java
  • 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();
    }
    
  • 相关阅读:
    Ubuntu 中软件的安装、卸载以及查看的方法总结
    无锁队列的环形数组实现
    Geodatabase模型
    地图投影与ArcGIS坐标系转换
    ARCGIS动态画点
    ArcEngine数据删除几种方法和性能比较
    AE开发技术文档--8种数据访问方法
    Hibernate 的HQL和sql有什么区别
    ActionContextCleanUp作用
    Hibernate延迟加载与opensessioninviewFilter
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13217301.html
Copyright © 2011-2022 走看看