欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Day2_Java进阶_Java反射【特别重要】

程序员文章站 2022-05-21 11:58:41
2020.7.6 10:37:00一、反射概述示例1:不同的人通过X光机得到类似的影像资料。在影像资料中包含人体的各个组成部分。示例2:学生类Student和老师类Teacher要想使用需先通过类加载器加载为对应的.class文件到内存。在.class文件中包含了成员方法、构造方法、成员变量等等一些相似的信息。Class是所有的.class文件对象所对应的类型。也就是说是所有类的影像。我们可直接通过Class类获取所有类的成员方法、构造方法等信息,而不是去找到Student类或其他类来得到这些信息...

2020.7.6 10:37:00

一、反射概述

示例1:不同的人通过X光机得到类似的影像资料。在影像资料中包含人体的各个组成部分。
Day2_Java进阶_Java反射【特别重要】
示例2:学生类Student和老师类Teacher要想使用需先通过类加载器加载为对应的.class文件到内存。在.class文件中包含了成员方法、构造方法、成员变量等等一些相似的信息。Class是所有的.class文件对象所对应的类型。也就是说是所有类的影像。
我们可直接通过Class类获取所有类的成员方法、构造方法等信息,而不是去找到Student类或其他类来得到这些信息。

Day2_Java进阶_Java反射【特别重要】

Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获得到的信息来创建对象,调用方法的一种机制
由于这种动态性,可以极大的增加程序的灵活性,程序在不用在编译期就完成确定,在运行期仍然可以拓展。

二、反射获取Class类的对象的三种方式

我们要想通过反射去使用一个类,首先我们需要获取到该类的字节码文件的对象,也就是类型为Class类型的对象。

这里我们提供了三种方式来获取Class类的对象:

  1. 使用类的class属性来获取该类对应的Class对象
    举例:Student.class将会返回Student类对应的Class对象。
  2. 调用对象的getClass()方法来 返回该对象所属类对应的Class对象
    getClass() 方法是Object类中的方法,所有的Java对象都可以调用该方法。
  3. 使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值为某个类的全路径,也就是完整包名的路径。
    示例:

①新建一个Student类:

package com.hoqis;

/**
 * @author HoQis
 * @create 2020-07-06 14:30
 */
public class Student {
    //成员变量:一个私有、一个默认、一个公共
    private String name;
    int age;
    public String address;

    //构造方法,一个私有、一个默认、两个公共
    public Student() {
    }

    private Student(String name){
        this.name=name;
    }

    Student(String name, int age){
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, String address){
        this.name = name;
        this.age = age;
        this.address = address;
    }

    //成员方法:一个私有、四个公共
    private void function(){
        System.out.println("function!!!");
    }

    public void method1(){
        System.out.println("method1");
    }

    public void method2(String s){
        System.out.println("method2"+s);
    }
    public String method3(String s,int i){
        return s+","+i;
    }

    @Override
    public String toString() {
        return "ReflectClass_Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

②新建一个获取Student类的ReflectDemo类。分别介绍了三种方式来获取Class类对象。

package com.hoqis;
/**
 * @author HoQis
 * @create 2020-07-06 11:25
*/

/*
三种方式来获取Class对象
    1.使用类的class属性来获取该类对应的Class对象
    2.调用对象的getClass()方法来获取所属类对应的Class对象
    3.使用Class类中的静态方法forName(String className),需传入字符串参数,该参数为某个类的全路径【完整包名】
 */
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.使用类的class属性来获取该类对应的Class对象
        Class<Student> c1 = Student.class;
        System.out.println("使用类的class属性来获取该类对应的Class对象:"+c1);

        Class<Student> c2 = Student.class;
        System.out.println(c1==c2);
        System.out.println("---------------------------");
        
        //2.调用对象的getClass()方法来返回该对象所属类对应的Class对象
        Student student = new Student();
        Class<? extends Student> c3 = student.getClass();
        System.out.println(c1==c3);
        System.out.println("---------------------------");

        //3.使用Class类中的静态方法forName(String className)
        Class<?> c4 = Class.forName("com.hoqis.Student");
        System.out.println(c1==c4);
    }
}

控制台打印得到的结果为:

使用类的class属性来获取该类对应的Class对象:class com.hoqis.Student
true
---------------------------
true
---------------------------
true

Process finished with exit code 0

【总结】说明这三种方式都能够正常获取到该类对应的Class对象。

三、反射获取构造方法并使用

本文地址:https://blog.csdn.net/qq_44853395/article/details/107151949