黑马程序员_基础加强第一天——Java反射机制

本文深入讲解Java反射机制的核心概念及应用。介绍了Class类的作用及如何通过不同方式获取Class实例,展示了如何利用Constructor类创建对象实例,如何使用Field类读取和修改对象的私有成员变量,并演示了Method类的使用方法以调用对象的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 反射的基石:Class类
    • Class类描述了类的名字,访问属性,属于的包名,字段名称的列表,方法名称的列表等信息
    • 如何得到各个字节码对应的实例对象(Class类实例)?
      1. 类名.class
      2. 对象.getClass();
      3. Class.forName("类名(包括包名)");
    • 基本数据类型.class.isPrimitive()返回true
    • int.class==Integer.TYPE返回true
  • 反射
    • 一个Java类用一个Class类的对象表示
    • Class类提供方法来获得Java类的信息。Field, Method, Constructor, Package等等。
    • 学习反射的要点是获得这些对象之后如何用
  • Constructor类
    • 得到某个类的所有构造方法:Constructor[] cons = Class.forName("java.lang.String").getConstructors();
    • 得到某个类的某个构造方法:Constructor con = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
    • 创建实例对象:
      • 通常方式:String s = new String(new StringBuffer("abc"));
      • 反射方式:String s = (String)constructor.newInstance(new StringBuffer("abc"));
    • Class.newInstance方法:
      • String s = (String)Class.forName("java.lang.String").newInstance();
      • 该方法内部先得到默认的构造方法
  • Field类:
    • 示例:获取一个对象中的成员值并且把对象中所有String类的成员变量中的b改成a
      public class ReflectPoint {
      	private int x;
      	public int y;
      	public String str1 = "abandon";
      	public String str2 = "basketball";
      	public String str3 = "binbow";
      	
      	public ReflectPoint(int x, int y){
      		this.x = x;
      		this.y = y;
      	}
      	
      	public String toString(){
      		return str1 + "    " + str2 + "    " + str3;
      	}
      }
      
      //主类:
      import java.lang.reflect.*;
      public class ReflectFieldDemo {
      
      	public static void main(String[] args) throws Exception{
      		// TODO Auto-generated method stub
      
      		ReflectPoint rp = new ReflectPoint(3,5);
      		//私有成员x:
      		Field fieldX = rp.getClass().getDeclaredField("x");
      		fieldX.setAccessible(true);  //因为私有所以要强行获取
      		System.out.println("x = " + fieldX.get(rp));
      		//公有成员y:
      		Field fieldY = rp.getClass().getField("y");
      		System.out.println("y = " + fieldY.get(rp));
      		
      		//改变对象中String成员的方法:
      		changeLetter(rp);
      		System.out.println(rp);
      	}
      	
      	//改变类的对象中String成员,将b换成a的方法:
      	public static void changeLetter(Object obj) throws Exception{
      		Field[] fields = obj.getClass().getFields();
      		for(Field field:fields){
      			if(field.getType() == String.class){
      				String oldV = (String)field.get(obj);
      				String newV = oldV.replace('b', 'a');
      				field.set(obj, newV);
      			}
      		}
      	}
      
      }
      

  • Method类
    • 得到类中的某一个方法: Method methodCharAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
    • 调用方法: methodCharAt.invoke(str, 1);
    • 如果invoke的第一个参数为null,说明该方法是静态方法
  • 数组的反射
    • 具有相同维数和元素类型的数组属于同一个类型,既具有相同的Class类对象
    • 代表数组的Class类实例对象的getSuperClass方法返回的父类为Object对应的Class
    • 基本类型的一维数组可当做Object,不可当做Object[];非基本类型的一维数组都可。
    • Arrays.asList()方法处理int[]和String[]时的差异
    • Array工具类用于完成对数组的反射操作(java.lang.reflect.Array)
内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值