Java中面向对象编程的一个重要特征-自省(反射)机制,获取类对象

概念

让一个对象在运行时,能够认清自己,例如知道自己有哪些属性,哪些方法,以及每个属性叫什么名字,是什么类型,是私有还是公有等等

.java文件=>.class(二进制),程序运行时,JVM会加载到对应类到内存中(.class文件),然后可以使用反射获取到对象的更详细细节

.class文件可以加载出class对象,对象就是类对象(这个对象的图纸,包含了这个对象的内部结构)在方法区中,每个类在使用之前都需要把对应类的的.class文件加载到内存中(类加载)双亲委派模型其实就是一系列的路径查找机制,在合适的目录中找到需要的.class文件,并且要保证同一个类不需要重复加载。

同一个类不管在代码中实际被使用多少次,对应的类对象一定只有一个(类对象是一个单例)单例:有的类只能被实例化一次。

用途

1、当遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应 用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 。
2、反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无论 是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的就是类 的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

反射基本信息

Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型,例如Person p = new
Student();这句代码中p在编译时类型为Person,运行时类型为Student。程序需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。

反射相关的类

在这里插入图片描述
Class类 是类对象的类型

获取类对象

1、直接通过全限定类名获取,使用 Class.forName(“类的全路径名”); 静态方法

前提:已明确类的全路径名有包的时候就必须加包的路径,还要有异常处理,优点就是在写代码的时候可以不用知道类的具体名字,它可以自动在运行时获取,也可以文本读入、用户输入等方式获得,是最灵活的
在这里插入图片描述
2、通过类的实例化获取,每个类都有隐藏的getClass()方法
在这里插入图片描述
3、通过类来直接获取(仅适合在编译前就已经明确要操作的 Class,最安全可靠,程序性能更高 这说明任何一个类都有一个隐含的静态成员变量 class)
在这里插入图片描述
一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的三种类对象进行比较,发现都是true
在这里插入图片描述

class Cat{
    private String name;

    public void eat(String food){
        System.out.println(name + "正在吃" + food);
    }
    public Cat(String name){
        this.name = name;
    }
}
public class TestReflect {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取类对象Cat,Cat类的说明书
        //1、直接通过全限定类名获取
        Class catClass = Class.forName("Cat");
        
        //2、通过类的实例化获取
        Cat cat = new Cat("mimi");
        Class catClass2 = cat.getClass();

        //3、通过类来直接获取
        Class catClass3 = Cat.class;

        System.out.println(catClass == catClass2);
        System.out.println(catClass == catClass3);
        System.out.println(catClass2 == catClass3);

    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值