java反射

java反射

1.反射的理解和好处
2.Class类的理解和特点
3.通过反射获取类中的成员
4.通过反射创建对象
5.通过反射调用类中的成员
6.通过反射观察泛型的本质

1.反射的理解和好处

反射的理解

在这里插入图片描述

反射的好处

案例一

张三和李四共同完成一个项目

张三:设计类:Music类(√)、Word类(×)

李四:创建对象,并调用里面的方法

public void method(){
	Music m = new Music();
	m.work();
	Word w = new Word();//编译错误
	w.work();
}


//使用反射
public void method(Object o){
	Object obj = o.getClass().newInstance();
	o.getClass().getMethod("work").invoke();
}

静态加载:编译期加载,也就是说编译时加载所有类,如果该类不存在,则直接报编译错误,所以依赖性太强。

动态加载:(反射)运行期加载。运行时加载用到的类,编译时如果该类不存在,不报编译错误,降低了依赖性

类的加载过程
1、装载:通过类加载器将字节码文件读入到方法区中,并为之开辟Class类的对象
2、链接:将读入到方法区的字节码文件中的二进制数据合并到JRE
3、初始化:将类中的静态成员进行初始化
类加载器

一)类加载器分类

启动类加载器
	引导类加载器
	扩展类加载器
	系统类加载器
用户自定义加载器

二)类加载器加载的机制

先从下往上 ,检测该类是否被加载器加载过。
然后再从上往下,依次判断类加载器是否可以加载该类!
获取类加载器
1、获取系统类加载器
ClassLoader loader = ClassLoader.getSystemClassLoader();

2、获取扩展类加载器
ClassLoader extLoader = loader.getParent();

3、获取引导类加载器
ClassLoader bootLoader = extLoader.getParent();

4、获取某个类所使用的类加载器
ClassLoader cl = 对应类的Class类对象.getClassLoader();

2.Class类的理解和特点 ★

  • 问:自定义的类,是一个对象吗?
    答:是

  • 问:自定义的类,是哪个类型的对象?
    答:java.lang.Class类

  • 问:Class类的对象如何创建
    答:不是new出来的,而是系统自动创建的,我们可以通过一定的方式获取对象的引用

特点
1.Class本身也是一个类
2.Class 对象只能由系统建立对象
3.一个类在 JVM 中只会有一个Class实例 
4.一个Class对象对应的是一个加载到JVM中的一个.class文件
5.每个类的实例都会记得自己是由哪个 Class 实例所生成
6.通过Class可以完整地得到一个类中的完整结构 
获取Class类对象的三种方式
1、Class.forName(全类名);
2、对象名.getClass()
3、类名.class

3.通过反射获取类中的成员

Class c = String.class;

一、获取类中的属性

Field[] fields = c.getFields();//获取public修饰的所有属性,包含从父类继承来的,不限于直接父类
Field[] fields = c.getDeclaredFields();//获取本类中定义的所有属性,不问修饰符

二、获取类中的方法

Method[] methods = c.getMethods();//获取public修饰的所有方法,包含从父类继承来的,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值