每天下班复习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
网友评论