Java中的反射机制

Posted XiaoMa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的反射机制相关的知识,希望对你有一定的参考价值。

1.聊聊Java中的反射机制

  (1)先说说静态编译和动态编译:

    ①静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题,但程序一大,加载的过程就比较费力了。

    ②动态编译就是你编译的时候那些模块都没有编译进去,一般情况下可以把那些模块都编译成dll,这样你启动程序时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。

  (2)反射就是程序在执行期间通过反射API(Refliection API)去获取到任何一个类的内部信息,包括这个类的属性、方法、注解等等;除此之外,还可以直接操作任意对象的内部属性和方法。为啥可以这样呢?因为加载完类之后,会在堆内存的方法区产生一个Class对象,这个对象包含了这个类的完整的结构信息,通过这个对象可以看到类的结构,然后去获取或者操作这个类的属性或者方法。

  (3)先举个简单的例子:新建一个名为testReflect的类,通过反射获取User类,输出这个类的HashCode值,证明一个一个类在内存中只有一个Class对象。

package com.xiaoma;

public class testRefection {
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获取User类,forName里传输包名+类名
        Class c1 = Class.forName("com.xiaoma.testRefection");
        Class c2 = Class.forName("com.xiaoma.testRefection");
        System.out.println(c1);
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }
}

//先写一个类,一会从主程序通过反射机制加载他
class user{
    private int id;
    private String name;
    private int age;

    public user() {
    }

    public user(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", name=\'" + name + \'\\\'\' +
                ", age=" + age +
                \'}\';
    }
}

  输出结果为:

 

2.深入刨析反射

  (1)我们知道所有的类都继承于Object类,在这个Object类中有一个泛型未知的Class方法,既public final native Class<?> getClass();,通过这个getClass会返回一个Class对象,这个Object类就是反射的源头,其实反射也挺好理解,就是通过对象反射求出类的名称,也就是上面例子中的第一行的输出结果。

  (2)图例说明:我们平常获取一个类中的属性或者方法的时候,一般是去new这个类,然后去调用这个类中的属性或者方法,结合下图可以理解为是自上而下的;反射呢可以把它理解为反着来,自下而上,不管是张三李四王五,还是阿猫阿狗,都最终指向Class对象。

  (3)反射的优劣:反射可以获取类中的私有的东西,而new则不可以;但是这种效果是以性能作为代价的,所以一般在框架中才会使用反射机制。

    反射

 new

3.Class类中的常用方法及其说明

 

 

 

 

  

以上是关于Java中的反射机制的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

java 反射代码片段

深入理解 Java 中的反射机制

关于JAVA中的反射机制的总结

java 中反射机制和内省机制的区别是啥?