反射_韩顺平讲Java_反射机制_类加载_reflection_Class_类结构

01_Java反射专题_反射机制问题

  1. 问题:根据配置文件 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);
	}
}
  • 传统方法无法解决这个问题
  1. 设计模式的 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程序在计算机的三个阶段
  1. 第一阶段:编译阶段,由源码通过javac编译字节码文件
  2. 第二阶段:class类阶段(加载阶段),加载后生成一个对象Class
  3. 第三阶段:Runtime运行阶段
Javac编译
类加载器
Cat
Cat.java源文件
private String name
public Cat()
public hi()
cat
Cat.class 字节码文件
private String name
public Cat()
public hi()
cat1
Cat.class 字节码文件
private String name
public Cat()
public hi()
Class1
class类对象/堆
成员变量Field[] field
构造器 Constructorl cons
成员方法 Method ms()
Class10
运行时,创建一个class的对象,保存了cat的信息
Cat cat = new Cat()
cat.hi()

04反射相关类

  1. java.lang.Class:代表一个类, Class对象表示某个类加载后在堆中的对象
  2. java.lang.reflect.Method: 代表类的方法
  3. java.lang.reflect.Field: 代表类的成员变量
  4. java.lang.reflect.Constructor: 代表类的构造方法
  • 这些类在java.lang.reflection

06_Java反射专题_Class类分析

  • Class也是类,因此也继承Objiect类[类图]
  • Class类对象不是new出来的,而是系统创建的[演示]
  • 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次[演示]每个类的实例都会记得自己是由哪个 Class 实例所生成
  • 通过Class可以完整地得到一个类的完整结构,通过一系列
  • Class对象是存放在堆的韩教1类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码变量名,方法名,访问权限等等)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值