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

目录

 

目录

一、什么是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
    }
发布了186 篇原创文章 · 获赞 45 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zhanshixiang/article/details/104069221
今日推荐