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中的反射机制的主要内容,如果未能解决你的问题,请参考以下文章