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光机得到类似的影像资料。在影像资料中包含人体的各个组成部分。
示例2:学生类Student和老师类Teacher要想使用需先通过类加载器加载为对应的.class文件到内存。在.class文件中包含了成员方法、构造方法、成员变量等等一些相似的信息。Class是所有的.class文件对象所对应的类型。也就是说是所有类的影像。
我们可直接通过Class类获取所有类的成员方法、构造方法等信息,而不是去找到Student类或其他类来得到这些信息。
Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获得到的信息来创建对象,调用方法的一种机制。
由于这种动态性,可以极大的增加程序的灵活性,程序在不用在编译期就完成确定,在运行期仍然可以拓展。
二、反射获取Class类的对象的三种方式
我们要想通过反射去使用一个类,首先我们需要获取到该类的字节码文件的对象,也就是类型为Class类型的对象。
这里我们提供了三种方式来获取Class类的对象:
- 使用类的class属性来获取该类对应的Class对象。
举例:Student.class将会返回Student类对应的Class对象。 - 调用对象的getClass()方法来 返回该对象所属类对应的Class对象 。
该 getClass() 方法是Object类中的方法,所有的Java对象都可以调用该方法。 - 使用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
下一篇: python练习5:爬取有道翻译