Java-反射详细讲解
《Java-反射详细讲解》共 0.4 万字,通篇围绕 安全、需求、场景、权限 展开,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(8 节)
- 反射引出
- 一个需求
- 传统方法
- 反射方法
- 反射是什么
- 反射机制原理示意
- 反射机制可以完成
- 反射相关的主要类
前言
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键
反射引出
一个需求
根据配置文件 re.properties 指定信息,创建 Cat 对象并调用方法 hi
classfullpath=com.jwt.Catmethod=hi
这样的需求在学习框架时很多,即在通过外部文件配置,在不修改源码的情况下,来控制程序。
传统方法
传统的方法是先 new 一个对象,然后再调用它的方法。
Cat cat = new Cat();cat.hi();
通过传统方法,确实可以调用 hi() 方法,但是这和我们的需求不一样,这里我们是要根据配置文件 re.properties 指定信息来完成。可以使用 Properties 来读取配置文件。
Properties properties = new Properties();
properties.load(new FileInputStream("src//re.properties"));
String classfullpath = properties.getProperty("classfullpath");
//"com.jwt.Cat"String methodName = properties.getProperty("method");
//"hi"System.out.println("classfullpath=" + classfullpath);
System.out.println("method=" + methodName);
然后需要创建对象,怎么创建对象呢?直接new classfullpath,这样不就好了嘛?嗯,想法不错,下回不要想了。现在的 classfullpath 可是字符串类型,怎么能去new呢。所以现有技术是做不到这个事情的。那么这里就要引入我们要将的重点——反射机制。
反射方法
public class ReflectionQuestion {
public static void main(String[] args) throws Exception {
//1. 使用Properties 类, 可以读取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src//re.properties"));
String classfullpath = properties.getProperty("classfullpath");
//"com.jwt.Cat"
String methodName = properties.getProperty("method");
//"hi"
System.out.println("classfullpath=" + classfullpath);
System.out.println("method=" + methodName);
//2. 使用反射机制解决
//(1) 加载类, 返回Class类型的对象cls
Class cls = Class.forName(classfullpath);
System.out.println("cls = " + cls);
//(2) 通过cls得到你加载的类com.jwt.Cat的对象实例
Object o = cls.newInstance();
System.out.println("o 的运行类型=" + o.getClass());
//运行类型
//(3) 通过cls得到你加载的类com.jwt.Cat的methodName "hi" 的方法对象
Method method = cls.getMethod(methodName);
//(4) 通过method 调用方法: 即通过方法对象来实现调用方法
method.invoke(o);
//传统方法对象.方法() , 反射机制:方法.invoke(对象)
}
}
反射机制还有一个优点,那就是可以通过外部文件配置,在不修改源码的情况下,来控制程序。比如这里,我在Cat 类下面再写一个方法,cry()方法,如果我们使用传统方法,要调用这个方法,是不是就要修改代码了,比如cat.cry();通过反射,只需在配置文件 re.properties 中,将 method=hi 改为 method=cry 就可以了。
反射是什么
简介
- 反射机制允许程序在执行时借助于 Reflection API 取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。
- 在运行状态中,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可以调⽤,总之通过“反射”,我们可以将Java这种静态语⾔附加上动态特性。
- 加载完类之后,在堆中就产生了一个 Class 类型的对象(一个类只有一个Class对象) ,这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个 Class 对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为反射
