当前位置: 移动技术网 > IT编程>开发语言>Java > Day2_Java进阶_Java反射【特别重要】

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

2020年07月07日  | 移动技术网IT编程  | 我要评论
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光机得到类似的影像资料。在影像资料中包含人体的各个组成部分。
在这里插入图片描述
示例2:学生类Student和老师类Teacher要想使用需先通过类加载器加载为对应的.class文件到内存。在.class文件中包含了成员方法、构造方法、成员变量等等一些相似的信息。Class是所有的.class文件对象所对应的类型。也就是说是所有类的影像。
我们可直接通过Class类获取所有类的成员方法、构造方法等信息,而不是去找到Student类或其他类来得到这些信息。

在这里插入图片描述

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网