每日java--Day01:反射(Reflection)

每天下班复习java,查漏补缺,温故而知新。

Day01:反射(Reflection)

定义:Java语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它在编译期不需要知道运行的对象是谁,Java反射实际操作对象是.class文件(字节码文件)

作用:动态(运行时)获取类的完整结构信息(变量、方法等
) & 调用对象的方法。

对比runtime:java的反射类似于iOS中的runtime机制,都可以动态获取类信息、属性设置获取、类的动态加载(NSClassFromString(@“className”))、方法的动态调用。不同的是objective-c能动态的给class添加类和方法,Java 则不行。动态机制也不同:Objective-C runtime 对 class method 的调用是通过全局名称查询。而 Java VM 是通过类似 C++ 的虚表机制。

实例

package Reflection;

import java.lang.reflect.Method;

public class Student {
    public static void main(String[] args) throws ReflectiveOperationException, IllegalAccessException {
         // 1. 获取Student类的Class对象
        Class studentClass = Student.class;
        // 2. 通过Class对象创建Student类的对象
        Object  mStudent = studentClass.getDeclaredConstructor().newInstance();

        // 3.1 通过Class对象获取方法setName1()的Method对象:需传入方法名
        // 因为该方法 = 无参,所以不需要传入参数
        Method  msetName1 = studentClass.getMethod("setName1");;

        // 通过Method对象调用setName1():需传入创建的实例
        msetName1.invoke(mStudent);

        // 3.2 通过Class对象获取方法setName2()的Method对象:需传入方法名 & 参数类型
        Method msetName2 = studentClass.getMethod("setName2",String.class);

       // 通过Method对象调用setName2():需传入创建的实例 & 参数值
        msetName2.invoke(mStudent,"lihuazhang");
    }
    public Student() {
            System.out.println("创建了一个Student实例");
     }
     // 无参数方法
    public void setName1 (){
        System.out.println("调用了无参方法:setName1()");
    }

    // 有参数方法
    public void setName2 (String str){
        System.out.println("调用了有参方法setName2(String str):" + str);
    }
   
} 
测试结果.png

你可能感兴趣的:(每日java--Day01:反射(Reflection))