Java基础学习之反射

Java基础学习之反射

反射是java中非常重要的知识点,无论是Bean的初始化还是获取标注的注解也可以用到反射,在日常开发中不会直接使用反射,但是我们在开发项目的时候基本每刻都在使用反射。

本文中会先介绍反射的思想、基本使用、以及优缺点。

正射

在了解反射前,可以先理解一下什么是正射,有光的地方就有黑暗,有反射就会有正射,在java中没有用到反射相关类的时候就是正射,用的最多的就是采用采用new的方式去实例化对象,在对实例化对象进行操作,例如:map

Map<Integer,Integer> map = new HashMap<>();
map.put(1,1);

如果HashMap不能满足需求时,需要将HashMap更换为LinkedHashMap存储,需要重新修改代码进行编译:

Map<Integer,Integer> map = new LinkedHashMap<>();
map.put(1,2);

每次需求的改变都需要进行一次代码的修改、编译、打包、重启是非常耗时的操作。如果采用一个开关传参来决定什么时候来决定使用哪一种数据结构。

public Map<Integer, Integer> getMap(String param) {
   
    Map<Integer, Integer> map = null;
    if (param.equals("HashMap")) {
   
        map = new HashMap<>();
    } else if (param.equals("LinkedHashMap")) {
   
        map = new LinkedHashMap<>();
    }
		return map; 
}

通过传参的方式来决定使用哪一种数据结构,可以在项目运行时动态传参来决定,如果需要的Map不存在就需要改变源码,重新编译,这个时候就需要反射来提升效率,如果在代码执行的时候不知道
要使用哪一种数据结构,只有程序运行的时候才决定使用哪一种数据结构。

反射的思想

反射可以在程序运行过程中动态获取类信息调用类方法,通过反射构造类实例。

官方文档的解释:Java的反射机制是指对于任意一个类都能够知道这个类的所有属性和方法,并且对于任意一个对象都能够调用他的任意一个方法,动态调用获取信息以及动态调用获取对象的方法就是Java的反射机制。

对于上面的获取Map的方法可以采用反射去实现,代码如下:

public Map<Integer,Integer> getMap(String className){
   
  Class clazz = Class.forName(className);
  Constructor con = clazz.getConstructor();
  return (Map<Integer,Integer>) con.newInstance();
}

通过传入全类名路径到方法中,获取对应的Map实例,例如:java.util.HashMap /java.util.LinkedHashMap,不需要修改上述源码。

采用这种方式可以不需要修改源码,就可以在运行时可以确定使用哪种数据结构,在切换类时无需修改源码或者重新编译程序。

反射的基本使用

Java反射的主要组成部分有四个:
image-20210225001904331

  • Class: 任何运行在内存中的所有类都是该Class类的实例对象,每个Class类对象内部都包含了本来的所有信息,通过反射去做任何事情首先找到Class不会有错;

  • Field:描述一个类的属性,内部包含了属性的所有信息,例如数据类型属性名访问修饰符

  • Constructor:描述一个类的构造方法,内部包含了构造方法的所有信息,例如参数类型参数名字访问修饰符

  • Method:描述一个类的所有方法(包含抽象方法),内部包含了该方法的所有信息,与Constructor类似,不同之处在于Method拥有返回值类型信息,因为构造方法是没有返回值的。

在学习反射的时候,以UserInfo位模板进行说明,该类的基本组成如下:属性构造函数和方法

public class UserInfo {
   

    public String name;

    public Integer age;

    private double weight; // 体重只有自己能知道

    public UserInfo(){
   

    }
    public UserInfo(String name,Integer age){
   
        this.name 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值