黑马程序员 反射

本文深入讲解Java反射机制的核心概念及应用。包括Class类的作用、如何获取Class实例、反射中Constructor、Field和Method对象的使用方法,以及数组与Object的关系等内容。

  ——- android培训java培训、期待与您交流! ———-

1,反射概述

其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。
反射就是把Java类中的各种成分映射成相应的java类。

2,Class类描述的信息

类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称列表等等。

String getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类等)名称

Method[] getMethods() 得到自己所有的方法列表

等等

3,获取Class文件对象三种方式

(a)类名.Class (Object类)

(b)对象.getClass() (数据类型)

(c)class.forName (“包名.类名”) (静态方法)

4,预定义Class实例对象

8个基本数据类型:基本数据类型.class

还有 void.class

5,Constructor

实例对象代表某个类中的一个构造方法

(a)得到某个类中所有的构造方法

Constructor< ? > []getConstructors()

(b)得到某个类中的一个构造方法.

Constructor< T > getConstructor(Class< ? >…parameter Types)

参数中传入要获取的构造方法的参数类型的字节码

(c)得到了构造函数的对象,现在要通过构造函数的对象,来创建类的实例对象。

通过Constructor类中的方法

T newInstance(Object… initargs)

使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

注意:

(a)得到构造方法时需要参数类型的字节码

(b)调用构造方法时需要参数类型的对象

/* 反射知识中Constructor类演示 */
public class ConstructorDemo {  
    public static void main(String[] args) throws Exception {  
        //1.获得一个类的字节码  
        Class class1 = Class.forName("java.lang.String");  
           //2.获得这个类的一个构造函数的对象,传入参数的字节码  
        Constructor constructor = class1.getConstructor(StringBuffer.class);  
        //3.调用newInstance()方法创建类的对象。  
        String string = (String)constructor.newInstance(new StringBuffer("准备进黑马了"));  
        //结果
        System.out.println("字符串中的第三个字符:"+string.charAt(3));  
    }  
} 

6,Field

Field对象代表某个类中的一个成员变量

获得Fidld对象的方法

Field getField(String name) 返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公共成员字段

Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

Field getDeclaredField(Stringname) 返回一个Field对象,用法和getField()方法一样,但它可以返回私有的成员变量

Field[] getDeclaredFields() 返回Class对象表示的类或接口的所有成员变量,公有私有都返回

暴力反射:

调用Field父类AccessibleObject中的方法:

void setAccessible(boolean flag) 传入true让私有的成员可以被反射

也就是使用setAccessible(true)使private类型的成员变量也可以被获取值

Filed中的方法

Object get(Object obj) 返回指定对象上此Field表示的字段的值

void set(Object obj, Objectvalue) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值

7,Method

实例对象代表某个类中的某个方法

获取Method对象的方法

Method getMethod(String name , Class< ? > … prameterTypes)
name是方法名,prameterTypes是方法的参数的字节码

Method[] getMethods() 获取类中所有公有方法和父类中的方法的集合

Method[] getDeclaredMethods() 获本类中所有方法,不管是公有还是私有

通过Method类中的 方法

Object invoke(Object obj , Object… args)

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

obj为使用这个方法的对象,args为要传入的参数

注意:

当invoke方法传入的第一个参数为null,说明这个方法是静态方法, 因为不需要对象来调用

/*  演示Method类中方法, Person类省略。  */  
public class MethodDemo {  
    public static void main(String[] args)throws Exception {  
        //创建Person类对象  
        Person person = new Person("赵六", 26);  
        //获取person对象的字节码,调用getMethod方法
        //由于toString方法不用传入参数,所以第二个参数为null  
        Method methodToString = person.getClass().getMethod("toString", null);  
        //使用invoke方法调用获取到的方法,person对象调用,不用传入参数  
        System.out.println(methodToString.invoke(person, null));  
    }  
}  

8,数组与Objcet的关系及其反射类型

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象

Class类中有一个方法Class< ? super T > getSuperclass() 返回这个方法的父类的字节码

通过数组的字节码调用此方法,得到的是Object的字节码。

数组的父类是Object,Array是Object的子类

注意:

基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用

【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为与电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率与稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持和技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模与优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度与深度。
针对TC275微控制器平台,基于AUTOSAR标准的引导加载程序实现方案 本方案详细阐述了一种专为英飞凌TC275系列微控制器设计的引导加载系统。该系统严格遵循汽车开放系统架构(AUTOSAR)规范进行开发,旨在实现可靠的应用程序刷写与启动管理功能。 核心设计严格遵循AUTOSAR分层软件架构。基础软件模块(BSW)的配置与管理完全符合标准要求,确保了与不同AUTOSAR兼容工具链及软件组件的无缝集成。引导加载程序本身作为独立的软件实体,实现了与上层应用软件的完全解耦,其功能涵盖启动阶段的硬件初始化、完整性校验、程序跳转逻辑以及通过指定通信接口(如CAN或以太网)接收和验证新软件数据包。 在具体实现层面,工程代码重点处理了TC275芯片特有的多核架构与内存映射机制。代码包含了对所有必要外设驱动(如Flash存储器驱动、通信控制器驱动)的初始化与抽象层封装,并设计了严谨的故障安全机制与回滚策略,以确保在软件更新过程中出现意外中断时,系统能够恢复到已知的稳定状态。整个引导流程的设计充分考虑了时序确定性、资源占用优化以及功能安全相关需求,为汽车电子控制单元的固件维护与升级提供了符合行业标准的底层支持。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户问的是关于黑马程序员的JavaSE笔记,我需要先确认这个资源的具体内容和结构。首先,黑马程序员是知名的IT培训机构,他们的JavaSE笔记应该涵盖Java基础的核心知识点。 接下来,我需要回忆一下JavaSE通常包含哪些内容。比如基础语法、面向对象、集合、IO、多线程、网络编程、反射、注解等等。可能还会包括常用的API和工具类,比如String、日期处理等。 然后,用户可能想知道笔记的结构是否清晰,是否有示例代码,有没有重点难点解析,以及是否适合自学。可能还需要说明笔记的适用人群,比如零基础、有经验的开发者等。 另外,用户可能对如何获取这些笔记感兴趣,是否需要付费,或者是否有公开的版本。但根据版权问题,可能需要建议用户通过正规渠道获取,比如官网或授权的平台。 还要考虑用户的实际需求,他们可能是在准备学习Java,或者复习基础知识,需要一份系统的学习资料。因此,回答中需要强调笔记的系统性和实用性,以及是否包含实战案例或练习题。 可能需要提醒用户,学习JavaSE时不仅要看笔记,还要多写代码,实践才能巩固知识。同时,可以建议结合视频课程或官方文档进行学习,效果会更好。 最后,确保回答结构清晰,分点说明,符合用户的要求,使用中文,并且遵循LaTeX格式的要求,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,但如果有涉及的地方要正确使用。</think>以下是对黑马程序员JavaSE笔记的系统性介绍,按学习路径分层解析: $$JavaSE\ 知识体系 = \{基础语法,\ 面向对象,\ 核心API,\ 高级特性\}$$ 一、基础语法层 1. 环境配置 - JDK安装与`JAVA_HOME`环境变量设置 - 验证命令:`java -version` - 第一个程序: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, 黑马!"); } } ``` 2. 数据类型 - 基本类型:`byte(1B)`, `int(4B)`, `double(8B)`等 - 引用类型:类、接口、数组 - 类型转换规则:自动转换与强制转换 3. 流程控制 - 分支结构:`if-else` / `switch`(注意穿透现象) - 循环结构:`for` / `while` / `do-while` - 示例: ```java for(int i=0; i<10; i++){ if(i % 2 == 0) continue; System.out.println(i); } ``` 二、面向对象层 1. 类与对象 - 类结构: ```java public class Person { // 字段 private String name; // 构造方法 public Person(String name) { this.name = name; } // 方法 public void speak() { System.out.println("我是" + name); } } ``` 2. 三大特性 - 封装:访问修饰符`private/protected/public`的使用 - 继承:`extends`关键字与方法重写规则 - 多态:父类引用指向子类对象,`instanceof`运算符 3. 接口与抽象类 - 接口定义: ```java interface USB { void transferData(); } ``` - 抽象类特性:包含抽象方法和具体实现 三、核心API层 1. 集合框架 - `Collection`体系: $$List \subset Collection,\quad Set \subset Collection,\quad Map \not\subset Collection$$ - 常用实现类:`ArrayList`, `LinkedList`, `HashMap` 2. IO流体系 - 字节流:`InputStream/OutputStream` - 字符流:`Reader/Writer` - 典型应用: ```java try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))){ String line; while((line = br.readLine()) != null){ System.out.println(line); } } ``` 3. 异常处理 - 异常分类:`Error` vs `Exception` - 处理机制: ```java try { // 可能抛出异常的代码 } catch(IOException e) { System.out.println("IO异常:" + e.getMessage()); } finally { // 资源释放 } ``` 四、高级特性层 1. 多线程编程 - 实现方式: - 继承`Thread`类 - 实现`Runnable`接口 - 线程同步:`synchronized`关键字与`Lock`接口 2. 反射机制 - 核心类:`Class`, `Method`, `Field` - 典型应用: ```java Class<?> clazz = Class.forName("com.example.Demo"); Object obj = clazz.newInstance(); Method method = clazz.getMethod("show"); method.invoke(obj); ``` 3. 注解开发 - 元注解:`@Target`, `@Retention` - 自定义注解: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TestCase { String value() default ""; } ``` 五、学习建议 1. 实践路径: $$编码练习量 \propto 技能掌握程度$$ 2. 调试技巧:熟练使用IDE的断点调试功能 3. 文档查阅:养成查看Java API文档的习惯 该笔记体系具有以下优势: - 代码示例丰富(每个知识点配套$3-5$个案例) - 重点标注明确(使用⚠️符号标记易错点) - 知识图谱完整(包含$200+$个核心知识点) 建议通过官方渠道获取最新版本笔记,配套视频教程学习效果更佳。学习过程中注意建立代码仓库(建议使用Git),定期进行阶段性项目实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值