反射

定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。

下面举个例子

package invoke;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


/**
 * @Author: 赵博雅
 * @Date: 2019/12/26 9:22
 */
public class invokes {

    static class Animal{
        private String name;    //名字

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void run(){
            System.out.println("动物奔跑。。。");
        }

    }
    static class dog extends Animal{
        private String loyal;   //忠诚度

        public String getLoyal() {
            return loyal;
        }

        public void setLoyal(String loyal) {
            this.loyal = loyal;
        }

        public void run(){
            System.out.println("一只小狗在奔跑。。。");
        }
        public void animalRun(){
            super.run();
        }

    }

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /**
         * dog继承Animal的属性和方法(或者重写)
         */
        dog dog = new dog();
        dog.setLoyal("9");
        dog.setName("狗");
        System.out.println(dog.getName() + "的忠诚度是" + dog.getLoyal());
        /**
         * 子类的run方法
         */
        dog.run();
        /**
         * 调用父类的run方法
         */
        dog.animalRun();
        System.out.println("--------------------------------------");
        /**
         * 如果在某些特定的条件下父类需要使用到子类的方法或者属性
         * 可以使用反射来完成
         * 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
         */
        dog onedog = new dog();
        onedog.setLoyal("8");
        /**
         * 正常情况下,Java中的继承关系决定了子类天然继承父类的一切,而父类是不能使用子类的私有方法或者属性的
         * 但是Java又提供了反射机制可以来处理这种情况
         */
        Animal animal = onedog;
        Method getLoyal = animal.getClass().getMethod("getLoyal");
        Object invoke = getLoyal.invoke(animal);
        System.out.println("通过反射获取子类的dog的忠诚度:" + invoke.toString());

    }
}

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注