Java中的反射(1)

Reflection in Java


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

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

一、RTTI

class对象编程

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

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

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文件。对象

什么是反射?

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

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

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

反射的三种形式

使用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

相关文章
相关标签/搜索