反射基础概念(Reflection)

发布于 2021-03-29  747 次阅读


(代码:Reflection文件夹)

静态 VS 动态语言

区分标准:运行时能否改变其结构

 

什么叫反射:

Java反射机制提供的功能:

 

反射的优点和缺点:

优点:可以实现动态创建对象和编译,体现出很大的灵活性;

缺点:对性能有影响,使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作;

性能:二者差了很多倍

 

反射相关的主要API

  • Java.lang.Class:代表一个类
  • Java.lang.reflect.Method:代表类的方法
  • Java.lang.reflect.Field:代表类的成员变量
  • Java.lang.reflect.Constructor:代表类的构造器

代码如下:

//什么叫反射
public class Test extends Object{
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//通过反射获取类的Class对象

Class<?> c1 = Class.forName("com.yang.reflection.Test");
System.out.println(c1);

Class<?> c2 = Class.forName("com.yang.reflection.Test");
Class<?> c3 = Class.forName("com.yang.reflection.Test");
Class<?> c4 = Class.forName("com.yang.reflection.Test");
//一个类在内存中只有一个Class对象
//一个类被加载后,类的整个结构都会被封装在Class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}

}
结果:
class com.yang.reflection.Test
1956725890
1956725890
1956725890

分析:
相同对象的Class都是同一个

Class类详解:
对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个结构的有关信息

  • Class本身也是一个类
  • Class对象只能由系统建立对象
  • 一个加载的类在JVM中只会有一个Class实例
  • 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • 每个类的实例都会记得自己是由哪个Class实例所生成(通过getClass()得到)
  • 通过Class可以完整地得到一个类中的所有被加载的结构
  • Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得对应的Class对象

 

 

 


她喜欢所以就做咯