• Java中的反射(1)


    Reflection in Java


    反射到底是什么呢,我被问到的时候其实也没办法很好的回答这个问题,翻一翻博客,然后逐条讲解。今天干脆就整合一下,免得以后还要去翻。

    首先讲一下Java是如何在运行时识别对象和类的信息,有两种方式,RTTI和反射,RTTI假设我们已经知道了所有的类型信息,反射让我们在运行过程中使用这些信息(尤其是私有的属性

    1、RTTI

    class对象

    RTTI是如何在Java中工作的呢,这些类型信息如何在运行时表示?这是由Class对象来完成的,顾名思义,它包含了所有和Class相关的信息。Java会使用class对象来执行RTTI,即使你正在执行的时类型转换这类的工作。

    每个Class都会产生一个class对象,保存在.class文件。(这样我们知道其实class对象是编译后的产物)所有的类都是在对其第一次使用的时候,动态加载到JVM的,但程序创造一个对静态成员的引用的时候,就会加载这个类。class对象只会在需要它的时候才会加载,而static初始化是在类加载时进行的。

    public class TestMain {
        Public static void main(String [] args) {
            System.out.println(A.name);
        }
    }
    class A {
        
        public static String name="Alice";
        
        static {
            System.ouut.print("A静态块");
        }
        
        pulic A(){
            System.out.println("A构造了")
        }
    }
    

    类加载器会检查这个类的Class对象是否已经被加载过,如果没有,就会根据类名来找到对应的.class文件。

    什么是反射?

    说了那么多有的没的,到底什么是反射呢

    对于任何一个类,我们都能知道这个类会有那些方法和属性。对于任何一个对象,我们能知道,可以调用它的方法和属性。这种动态获取对象信息和调用对象方法的过程叫做Reflection

    所谓的反射,也就是获取类的字节码(.class文件),通过class对象获取

    反射的三种形式

    使用getClass来获取此Object的运行时类

    Test t = new Test();//对象创建
    
    Class c = t.getClass();//获取Class对象
    
    System.out.println(c.getName());//打印名称
    
    

    直接.class

    Class c = Test.Class;
    

    Class.forName()这个在数据库操作里面用的很多了

    try {
        Class c = Class.forName("com.jhin.Test");
        System.out.print(c.getName());
    } catch (ClassNotFoundExcetion e){
        e.printStackTrace();
    }
    

    一般我们选用Class.forName

    参考:


    《Java编程思想》

    Java重点基础:反射机制 https://baijiahao.baidu.com/s?id=1619748187138646880&wfr=spider&for=pc

  • 相关阅读:
    JavaScript学习总结【5】、JS DOM
    JavaScript学习总结【11】、JS 运动
    JavaScript学习总结【7】、JS RegExp
    JavaScript学习总结【1】、初识JS
    JavaScript学习总结【10】、DOM 事件
    直接选择排序及交换二个数据的实现
    快速排序
    Lucene.net搜索结果排序(单条件和多条件)
    冒泡排序
    直接插入排序的三种实现
  • 原文地址:https://www.cnblogs.com/QuixoteY/p/11047090.html
Copyright © 2020-2023  润新知