Java基础之一反射机制


反射是框架设计的灵魂,使用反射的前提条件是:必须先获取到Class类,Class类用于表示.class文件。 注意,在运行期间,一个类,只有一个Class对象产生。

一、反射的概述

在运行时,允许程序在执行期间借助于Reflection API 取得任何类的内部信息,并能够直接操作任意对象的内部属性和方法。

在加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射

正常方式:引入需要的 包的名称----> 通过new实例化---->取得实例化对象
反射方式: :实例化对象---->getClass( )方法---->得到完整的包名称

反射相关的主要API:

java.lang.Class   代表一个类 
java.lang.reflect.Method
java.lang.reflect.Field
java.lang.reflect.Constructor 

二、理解Class类并获取Class实例

类的加载过程:

程序在经过javac.exe编译后,生成.class字节码文件,每一个java类对应一个字节码文件。之后使用java.exe对某个字节码文件进行解释运行,相当于将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,称为运行时类,此运行时类,就作为Class的一个实例。

获取Class实例的几种方式

//方式1:调用运行时类的属性
Class clazz1 = Person.class;

//方式2:通过运行时类的对象,调用getClass( )
Person p1 = new Person();
Class clazz2 = p1.getClass();

//方式3:调用Class的静态方法forName(对象的全路径)
Class clazz3 = Class.forName("com.atguid.java.Person")

方式4:使用类的加载起ClassLoader  ReflectionTest是当前文件的类名
ClassLoader classLoader = ReflectionTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("com.atguid.java.Person")

三、类的加载器ClassLoader

作用:

将Class字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

ClassLoader的类型:

Bootstrap ClassLoader 引导类加载器,使用C++编写,是JVM自带的类加载器,负责java平台核心库,用来装在核心类库,如加载String等,该加载器无法直接获取

Extension Classloader 扩展类加载器,加载java JDK下jre lib库下的ext文件下的jar包文件

System Classloader 系统类加载器,加载我们自己定义的一些类

自定义类加载器

ClassLoder 读取配置文件:

Properties pros = new Properties();

//读取配置文件方式1 
//注意 jdbc.properties此时默认在当前的module下
FileInput Stream fis = new FileInputStream("jdbc.properties");
pros.load(fis);

//读取配置文件方式2 使用classLoader
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
//注意 jdbc.properties此时默认在当前的module下的src目录下
//或者如果有Resource文件夹,需要将配置文件放在这个文件夹下,不然报错
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
pros.load(is);

四、创建运行时类的对象

//加泛型之后,下面就不用强转了,这个泛型决定了newInstance的返回值类型
Class<Person> clazz1 = Person.class;
Person obj = clazz1.newInstance();

注意,如果想要newInstance()方法正常运行,需要满足以下两个条件

1 运行时类必须提供空参的构造器

2 空参的构造器的访问权限得够,通常设置为public

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值