当前位置 博文首页 > 真香号:反射机制——(1)概念、应用场景、细节&Class对象

    真香号:反射机制——(1)概念、应用场景、细节&Class对象

    作者:[db:作者] 时间:2021-09-12 15:05

    目录

    ?

    目录

    一、什么是Java反射:

    二、应用场景

    三、Class字节码对象

    四、获取Class对象的三种方式


    一、什么是Java反射:

    ? ? ? ? 反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些类,这些类因为之前用不到,所以没有加载到JVM,这时,使用Java反射机制可以在运行期动态的创建对象并调用其属性,它是在运行时根据需要才加载。

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

    ? ? ? ?动态获取类中的信息,就是Java反射,可以理解为对类的解剖。

    ?

    二、应用场景

    当我们在开发软件时,有时软件以及做好了,又需要加功能怎么办?那么我们可以在做软件时给他们提供一个接口,需要加功能时,实现该接口就行。

    ?

    三、Class字节码对象

    四、获取Class对象的三种方式

    Person类

    public class Person {
    
        private int age;
        private String name;
    
        public Person(String name,int age) {
            super();
            this.age = age;
            this.name = name;
    
            System.out.println("Person param run..."+this.name+":"+this.age);
    
        }
        public Person() {
            super();
    
            System.out.println("person run");
    
        }
    
        public void show(){
            System.out.println(name+"...show run..."+age);
        }
    
        private void privateMethod(){
            System.out.println(" method run ");
        }
    
        public void paramMethod(String str,int num){
            System.out.println("paramMethod run....."+str+":"+num);
    
        }
        public static void staticMethod(){
            System.out.println(" static method run......");
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    

    ?

    ?第一种:Object中getClass( )方法

    /**
         * 第一种
         * 1、Object类中的getClass()方法
         * 想要这种方式,必须要明确具体的类,并创建对象
         * 麻烦
         */
        public static void getClassObjetc_1() {
            Person p1 = new Person();
            Class<? extends Person> clazz = p1.getClass();
    
            Person p2 = new Person();
            Class<? extends Person> clazz2 = p2.getClass();
    
            System.out.println(clazz == clazz2);//true
        }
    

    第二种:任何数据类型都有一个静态属性.class类获取其对应的Class对象

     /**
         * 第二种
         * 2、任何数据类型都有一个静态属性.class类获取其对应的Class对象。
         * 相对简单 但还是要明确用到类中的静态成员。
         * 但是还是不够扩展
         */
        public static void getClassObject_2(){
            Class<Person> clazz = Person.class;
            Class<Person> clazz2 = Person.class;
    
            System.out.println(clazz==clazz2);//true
        }

    第三种:Class.forName("xxxx") 给定字符串类名获取

    /**
         * 方式三
         * 3、只要通过给定的类的字符串名称(类路径)就可以获取该类,更为扩展
         *  用Class 类中的方法就可以完成
         *  该方法就是Class.forName()
         *  该方法只要有名称即可,更方便,扩张性更强。
         *
         */
        public static void getClassObject_3() throws ClassNotFoundException {
    
            String className="com.study.reflection.Person";
            Class<?> clazz = Class.forName(className);
            System.out.println(clazz);//class com.study.reflection.Person
        }
    

    ?

    ?

    cs
    下一篇:没有了