当前位置: 首页 > news >正文

【Java基础】反射,注解,异常,Java8新特性,object类-详细介绍

文章目录

    • 什么是反射
    • 反射的常用场景
    • Java 注解的原理
    • 异常机制详解
      • 异常类层次结构
      • 异常分类
    • 异常处理方式
      • 1. try-catch-finally
      • 2. 抛出机制
    • equals 与 == 的区别
    • hashCode 与 equals 的关系
      • 契约规则
    • String vs StringBuffer vs StringBuilder
    • Java 8 核心新特性
      • 1. Lambda 表达式
      • 2. 函数式接口
      • 3. Stream API
      • 4. Optional 类
      • 5. 其他重要特性

什么是反射

反射是指程序在运行过程中,对于任意一个类,都能获取它的属性和方法;对于任意一个对象,都能调用其属性和方法。这种动态获取类信息并操作对象的能力称为 Java 的反射机制。

// 反射示例:获取类方法
Class<?> clazz = Class.forName("java.lang.String");
Method method = clazz.getMethod("length");
int length = (int) method.invoke("Hello");  // 返回 5

反射的常用场景

场景说明
配置文件动态加载配置中指定的类(如 Spring 的 applicationContext.xml
注解反射是读取注解含义的核心工具(如 @Override@Autowired
框架Spring、Hibernate 等框架通过反射实现依赖注入和动态代理

Java 注解的原理

注解本质是一个继承了 Annotation 的接口,其具体实现类是 JVM 运行时生成的动态代理类。通过反射获取注解时,返回的是动态代理对象。

// 注解定义示例
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String value() default "";
}// 反射获取注解
MyAnnotation anno = MyClass.class.getAnnotation(MyAnnotation.class);
System.out.println(anno.value());  // 输出注解值

异常机制详解

异常类层次结构

Throwable
Error
Exception
OutOfMemoryError
RuntimeException
IOException
NullPointerException
IndexOutOfBoundsException
FileNotFoundException

异常分类

类型特点示例
ErrorJVM 环境错误,无需强制捕获OutOfMemoryError
RuntimeException程序逻辑错误,非强制捕获(未检查异常)NullPointerException
非运行时异常外部错误,必须捕获或声明抛出(检查异常)IOException

异常处理方式

1. try-catch-finally

try {FileInputStream file = new FileInputStream("test.txt");
} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());
} finally {System.out.println("资源清理操作");
}

2. 抛出机制

关键字作用示例
throw在方法内主动抛出异常throw new IllegalArgumentException();
throws在方法声明中指定可能抛出的异常public void read() throws IOException

equals 与 == 的区别

String s1 = new String("Hello");
String s2 = new String("Hello");System.out.println(s1 == s2);       // false(比较内存地址)
System.out.println(s1.equals(s2));  // true(比较内容)
比较对象== 作用equals 作用
基本类型比较值是否相等不可用
引用类型比较内存地址是否相同默认比较地址,可重写逻辑

hashCode 与 equals 的关系

契约规则

  1. a.equals(b) == true,则 a.hashCode() == b.hashCode()
    必须遵守
  2. a.hashCode() == b.hashCode()a.equals(b) 不一定为 true
    (哈希冲突时可能发生)
// 正确重写示例
@Override
public int hashCode() {return Objects.hash(name, age);  // 基于关键字段生成
}@Override
public boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);
}

String vs StringBuffer vs StringBuilder

特性StringStringBufferStringBuilder
可变性❌ 不可变✅ 可变✅ 可变
线程安全✅ 安全✅ (synchronized)❌ 不安全
性能低(频繁创建新对象)
适用场景常量字符串多线程环境字符串操作单线程环境字符串操作
// 性能对比示例
String result = "";  // 每次拼接生成新对象
for (int i = 0; i < 10000; i++) {result += i;     // 效率极低!
}StringBuilder sb = new StringBuilder();  // 单线程首选
for (int i = 0; i < 10000; i++) {sb.append(i);    // 内存操作,高效
}

Java 8 核心新特性

1. Lambda 表达式

// 替代匿名内部类
Runnable task = () -> System.out.println("Hello Lambda!");
new Thread(task).start();

2. 函数式接口

@FunctionalInterface
public interface Calculator {int calculate(int a, int b);  // 单一抽象方法
}Calculator add = (x, y) -> x + y;
System.out.println(add.calculate(3, 5));  // 输出 8

3. Stream API

List<String> list = Arrays.asList("a", "b", "c");
list.stream().filter(s -> !s.equals("b")).map(String::toUpperCase).forEach(System.out::println);  // 输出 A, C

4. Optional 类

Optional<String> name = Optional.ofNullable(getName());
System.out.println(name.orElse("default"));  // 避免 NPE

5. 其他重要特性

特性说明
接口默认方法default void log() { System.out.println("接口方法实现"); }
方法引用list.forEach(System.out::println)
日期时间 APILocalDateTime.now().plusDays(1)
并行数组排序Arrays.parallelSort(arr)
http://www.lryc.cn/news/624334.html

相关文章:

  • 鸿蒙中应用框架和应用模型
  • 【P18 3-10】OpenCV Python—— 鼠标控制,鼠标回调函数(鼠标移动、按下、。。。),鼠标绘制基本图形(直线、圆、矩形)
  • CVPR 2025|英伟达联合牛津大学提出面向3D医学成像的统一分割基础模型
  • rust 从入门到精通之变量和常量
  • 视觉语言导航(14)——VLN ON ROBOTIC 4.4
  • 多线程初阶-线程安全 (面试和工作的重点!!!)
  • Gartner发布2025年AI与网络安全成熟度曲线:用AI增强网络安全计划的27项技术与创新
  • 猫头虎AI分享|一款智能量化交易系统:QuantCell,从数据收集到策略执行全流程自动化
  • #Datawhale 组队学习#8月-工作流自动化n8n入门-1
  • 牛子图论进阶
  • ChatGPT-5 对教育行业的影响与案例研究
  • 【领码课堂】AI写码不再“盲跑”,方案先行,自动化高效落地
  • 【完整源码+数据集+部署教程】无人机目标检测系统源码和数据集:改进yolo11-efficientViT
  • MQTT(轻量级消息中间件)基本使用指南
  • lesson41:MySQL数据库进阶实战:视图、函数与存储引擎全解析
  • 大数据计算引擎(一)——Spark
  • 国产化Excel处理组件Spire.XLS教程:使用 C# 从数据库导出数据到 Excel(含 SQL 示例)
  • 利用DeepSeek辅助WPS电子表格ET格式分析
  • iOS 应用上架全流程实践,从开发内测到正式发布的多工具组合方案
  • C++ 是技术面试中的高频考察测点(基础知识)
  • 【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
  • Laravel中如何使用php-casbin
  • Effective C++ 条款48:认识模板元编程
  • ARM 架构简明教程学习笔记
  • 23.CNN系列网络思考
  • 科伦博泰:商业化引爆点已至,冲向Biopharma的“最后一公里”
  • 基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
  • C++11列表初始化 {}
  • 【数据可视化-92】使用 Pyecharts 绘制乡镇街道级地图:以安徽省黄山市休宁县为例(我的老家)
  • 【数据结构】深入理解双向链表:结构、实现与对比分析