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

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。Java中面向对象编程的一个重要特征-自省(反射)机制,获取类对象,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概念

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

.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);

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/152990.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!