01_Java反射专题_反射机制问题
- 问题:根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi
//re.properties配置文件的键值对
classfullpath=com.hspedu.Cat
method=hi
com.hspedu.reflection.question
public class cat {
private String name = "招财猫";
public void hi() {
System.out.println("hi " + name);
}
}
- 传统方法无法解决这个问题
- 设计模式的 ocp原则(开闭原则:不修改源码,扩容功能)
02_Java反射专题_反射快速入门
使用反射解决问题1
- 即通过外部文件配置,在不修改源码情况下,来控制程序
package com.hspedu.reflection.question;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectionQuestion {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, IOException, InvocationTargetException, NoSuchMethodException {
//1。使用Properties 类,可以读写配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src\\com\\hspedu\\reflection\\question\\re.properties"));
String classfullpath = properties.get("classfullpath").toString();//"com.hspedu.Cat"
String method = properties.get("method").toString();
System.out.println("classfullpath=" + classfullpath);
System.out.println("method=" + method);
//(1) 加载类,返回CLass类型的对象cLs
Class cls = Class.forName(classfullpath);
//(2) 通过 cLs 得到你加载的类 com.hspedu.Cat 的对象实例
Object o = cls.newInstance();
System.out.println("o的运行类型="+ o.getClass()); //运行类型
//(3) 通过 cLs 得到你加载的类 com.hspedu.Cat 的 methodName"hi"的方法对象//即:在反射中,可以把方法视为对象 (万物皆对象 )
Method method1 = cls .getMethod(method);
//(4) 通过method1 调用方法: 即通过方法对象来实现调用方法
System.out.println("======================");
method1.invoke(o);
//传统方法 对象,方法() ,反射机制 方法.invoke(对象)
}
}
03_Java反射专题_反射原理图
- Java Reflection
反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到 - 加载完类之后,在堆中就产生了一个Class类型的对象 (一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射
- java程序在计算机的三个阶段
- 第一阶段:编译阶段,由源码通过javac编译字节码文件
- 第二阶段:class类阶段(加载阶段),加载后生成一个对象Class
- 第三阶段:Runtime运行阶段
04反射相关类
- java.lang.Class:代表一个类, Class对象表示某个类加载后在堆中的对象
- java.lang.reflect.Method: 代表类的方法
- java.lang.reflect.Field: 代表类的成员变量
- java.lang.reflect.Constructor: 代表类的构造方法
- 这些类在java.lang.reflection
06_Java反射专题_Class类分析
- Class也是类,因此也继承Objiect类[类图]
- Class类对象不是new出来的,而是系统创建的[演示]
- 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次[演示]每个类的实例都会记得自己是由哪个 Class 实例所生成
- 通过Class可以完整地得到一个类的完整结构,通过一系列
- Class对象是存放在堆的韩教1类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码变量名,方法名,访问权限等等)