Java高级特性

引言

Java不仅提供了基础的编程功能,还包括了一系列强大的高级特性,这些特性能够显著提高代码的灵活性、可扩展性和性能。本文将详细介绍Java的几个高级特性,包括反射机制、注解与注释、泛型编程、以及Lambda表达式与Stream API,并通过表格进行总结和示范。

反射机制

什么是反射?

反射是Java动态语言特性的一个重要体现,它允许在运行时获取类的详细信息、操作类的属性和方法。利用反射,可以在运行时动态地创建对象、调用方法和访问字段,从而提高代码的灵活性。

反射的基本操作

获取类信息

使用Class对象获取类的详细信息。

java

Copy

public class ReflectionExample {public static void main(String[] args) {try {Class<?> clazz = Class.forName("java.lang.String");// 获取类名System.out.println("Class Name: " + clazz.getName());// 获取类的所有方法Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println("Method: " + method.getName());}} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

动态创建对象

使用Constructor对象动态创建实例。

java

Copy

import java.lang.reflect.Constructor;public class DynamicInstanceExample {public static void main(String[] args) {try {Class<?> clazz = Class.forName("java.lang.String");Constructor<?> constructor = clazz.getConstructor(String.class);// 创建对象实例Object instance = constructor.newInstance("Hello, Reflection!");System.out.println("Instance: " + instance);} catch (Exception e) {e.printStackTrace();}}
}

调用方法

使用Method对象动态调用类的方法。

java

Copy

import java.lang.reflect.Method;public class MethodInvocationExample {public static void main(String[] args) {try {Class<?> clazz = Class.forName("java.lang.String");Method method = clazz.getMethod("substring", int.class, int.class);// 调用方法String result = (String) method.invoke("Hello, Reflection!", 7, 17);System.out.println("Result: " + result);} catch (Exception e) {e.printStackTrace();}}
}

反射常用类与方法表

类/接口方法描述
ClassforName(String)获取指定类的Class对象
getName()获取类名
getDeclaredMethods()获取所有声明的方法
ConstructornewInstance(Object...)创建实例
Methodinvoke(Object, Object...)调用方法

注解与注释

什么是注解?

注解(Annotation)是Java提供的一种元数据,用于在代码中提供额外信息,它并不直接影响程序行为,但可以通过工具或框架解析和处理注解。注解常用于代码生成、编译时检查、文档生成等。

定义与使用注解

定义自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {String value();
}

使用自定义注解

public class AnnotationUsageExample {@MyAnnotation(value = "Test Method")public void testMethod() {System.out.println("Testing method with annotation");}public static void main(String[] args) {try {Method method = AnnotationUsageExample.class.getMethod("testMethod");if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("Annotation Value: " + annotation.value());}method.invoke(new AnnotationUsageExample());} catch (Exception e) {e.printStackTrace();}}
}

注解与注释的常见类型表

注解描述
@Override表示方法覆盖了父类方法
@Deprecated表示方法或类已过时,不建议使用
@SuppressWarnings抑制编译器警告

泛型编程

什么是泛型?

泛型(Generic)是Java中的一种代码复用机制,允许在类、接口和方法定义中引入类型参数,从而使代码可以处理多种数据类型而不需要类型转换。泛型提高了代码的安全性和可读性。

泛型类与方法

定义泛型类

public class GenericClass<T> {private T value;public GenericClass(T value) {this.value = value;}public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}

使用泛型类

public class GenericUsageExample {public static void main(String[] args) {GenericClass<String> stringInstance = new GenericClass<>("Hello, Generic!");System.out.println("String Value: " + stringInstance.getValue());GenericClass<Integer> integerInstance = new GenericClass<>(123);System.out.println("Integer Value: " + integerInstance.getValue());}
}

定义泛型方法

public class GenericMethodExample {public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {String[] stringArray = {"A", "B", "C"};Integer[] intArray = {1, 2, 3};printArray(stringArray);printArray(intArray);}
}

常用泛型集合表

集合类描述示例代码
ArrayList<T>动态数组,允许重复元素ArrayList<String> list = new ArrayList<>();
HashSet<T>无序集合,不允许重复元素HashSet<Integer> set = new HashSet<>();
HashMap<K, V>键值对映射,不允许重复键HashMap<String, Integer> map = new HashMap<>();

Lambda表达式与Stream API

什么是Lambda表达式?

Lambda表达式是一种简洁的函数表示方法,可替代匿名内部类,使得代码更加简洁和易读。Lambda表达式主要用于简化对集合的操作,特别是在使用Stream API时。

Lambda表达式的基本语法

(parameters) -> expression
或
(parameters) -> { statements; }

示例:使用Lambda表达式

import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> names = Arrays.asList("John", "Jane", "Jack");names.forEach(name -> System.out.println("Hello, " + name));}
}

什么是Stream API?

Stream API是Java 8引入的一套用于处理集合(如List、Set、Map)的强大工具。它支持函数式编程风格,通过一系列中间操作(如filtermap)和终端操作(如forEachcollect)实现高效的数据处理。

示例:使用Stream API

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 筛选偶数,计算平方,并收集结果List<Integer> result = numbers.stream().filter(n -> n % 2 == 0).map(n -> n * n).collect(Collectors.toList());System.out.println(result);}
}

Lambda表达式与Stream API常用方法表

方法描述示例代码
forEach对集合中的每个元素执行操作list.forEach(element -> { ... });
filter筛选符合条件的元素stream.filter(element -> element > 0);
map对集合中的每个元素进行转换stream.map(element -> element * 2);
collect将流中的元素收集成另一集合stream.collect(Collectors.toList());
reduce将流中的元素根据某个策略合并成一个值stream.reduce(0, (a, b) -> a + b);
sorted对流中的元素进行排序stream.sorted();
distinct去除流中的重复元素stream.distinct();
limit截取流中的前n个元素stream.limit(5);

表格总结

反射常用类与方法表

类/接口方法描述
ClassforName(String)获取指定类的Class对象
getName()获取类名
getDeclaredMethods()获取所有声明的方法
ConstructornewInstance(Object...)创建实例
Methodinvoke(Object, Object...)调用方法

注解与注释的常见类型表

注解描述
@Override表示方法覆盖了父类方法
@Deprecated表示方法或类已过时,不建议使用
@SuppressWarnings抑制编译器警告

常用泛型集合表

集合类描述示例代码
ArrayList<T>动态数组,允许重复元素ArrayList<String> list = new ArrayList<>();
HashSet<T>无序集合,不允许重复元素HashSet<Integer> set = new HashSet<>();
HashMap<K, V>键值对映射,不允许重复键HashMap<String, Integer> map = new HashMap<>();

Lambda表达式与Stream API常用方法表

方法描述示例代码
forEach对集合中的每个元素执行操作list.forEach(element -> { ... });
filter筛选符合条件的元素stream.filter(element -> element > 0);
map对集合中的每个元素进行转换stream.map(element -> element * 2);
collect将流中的元素收集成另一集合stream.collect(Collectors.toList());
reduce将流中的元素根据某个策略合并成一个值stream.reduce(0, (a, b) -> a + b);
sorted对流中的元素进行排序stream.sorted();
distinct去除流中的重复元素stream.distinct();
limit截取流中的前n个元素stream.limit(5);

应用场景与实践

反射机制的应用场景

反射常用于框架和库的开发,如Spring和Hibernate,这些框架通过反射动态创建对象和调用方法。同时,反射还可以用于工具和调试,动态分析和处理类。

示例:使用反射实现简单的依赖注入

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;public class DependencyInjection {public static void main(String[] args) {Container container = new Container();Service service = container.getService(Service.class);service.execute();}
}class Container {public <T> T getService(Class<T> clazz) {try {Constructor<T> constructor = clazz.getConstructor();T instance = constructor.newInstance();for (Field field : clazz.getDeclaredFields()) {if (field.isAnnotationPresent(Inject.class)) {field.setAccessible(true);field.set(instance, new ServiceImpl());}}return instance;} catch (Exception e) {throw new RuntimeException(e);}}
}class ServiceImpl implements Service {public void execute() {System.out.println("Service executed!");}
}@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Inject {}interface Service {void execute();
}class AppService implements Service {@Injectprivate Service service;public void execute() {service.execute();}
}

泛型编程应用场景

泛型编程常用于提高代码的复用性和类型安全性。例如,集合框架中广泛使用泛型,以确保存储在集合中的元素类型一致。

示例:创建泛型栈(Stack)

import java.util.ArrayList;
import java.util.List;public class GenericStack<T> {private List<T> stack = new ArrayList<>();public void push(T item) {stack.add(item);}public T pop() {if (!stack.isEmpty()) {return stack.remove(stack.size() - 1);}return null;}public static void main(String[] args) {GenericStack<String> stack = new GenericStack<>();stack.push("Hello");stack.push("World");System.out.println(stack.pop());System.out.println(stack.pop());}
}

Stream API应用场景

Stream API用于处理数据流,如集合和数组,可以简洁而高效地对数据进行过滤、转换、排序和收集操作。

示例:使用Stream API处理数据流

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamApiExample {public static void main(String[] args) {List<String> names = Arrays.asList("John", "Jane", "Jack", "Jill", "James");// 过滤以J开头的名字,并转换为大写List<String> result = names.stream().filter(name -> name.startsWith("J")).map(String::toUpperCase).collect(Collectors.toList());System.out.println(result);}
}

总结

本文详细介绍了Java的高级特性,包括反射机制、注解与注释、泛型编程、以及Lambda表达式与Stream API。通过示例代码和表格总结,帮助您更好地理解和应用Java的这些高级特性,提高代码的灵活性、可扩展性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程&#xff0c;相信大家也有一些类似的使用场景。 能自动化的事情&#xff0c;绝不自己干。 为防止被检测是机器人做题&#xff0c;刷视频&#xff0c;需要做一些小调整。 先来看作为服务方维护者&#xff0c;是如何检测是Selenium打…

sqoop的安装配置

1. 上传并解压安装包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../server/ 重命名&#xff1a;mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop 2. 配置环境变量 sudo vim /etc/profile # 配置sqoop的环境变量 export SQOOP_HOME/export/server/sqoop export PATH$PATH…

VS2022文本框的控制输入

老问题新玩法&#xff0c;VS2022 C# 文本框的控制输入&#xff0c;多文本框输入控制相同 一、只允许输入正整数1、在 _textID 文本框中添加 KeyPress 事件2、在 _textID 文本框 KeyPress 事件添加代码 二、只允许输入正数、负数&#xff0c;小数点不能是第一位&#xff0c;负号…

【JS重点10】箭头函数(十分重要)

目录 本文章重点&#xff1a; 一&#xff1a;箭头函数 目的&#xff1a; 使用场景&#xff1a; 语法&#xff1a; 箭头函数参数 箭头函数this 二&#xff1a;箭头函数与普通函数区别 本文章重点&#xff1a; 能够熟练写出箭头函数的不同写法 清楚的知道箭头函数与普通…

Java开发中的常用字段校验注解

在 Java 开发中&#xff0c;数据校验是确保应用程序的数据完整性和一致性的重要步骤。Java 提供了一系列注解来简化数据校验的过程&#xff0c;以下是一些常用的字段校验注解及其示例代码&#xff1a; NotNull NotNull 用于确保字段不为 null&#xff0c;适用于任何类型的字段…

L49---2154. 将找到的值乘以 2(排序)---Java版

1.题目描述 给你一个整数数组 nums &#xff0c;另给你一个整数 original &#xff0c;这是需要在 nums 中搜索的第一个数字。 接下来&#xff0c;你需要按下述步骤操作&#xff1a; 如果在 nums 中找到 original &#xff0c;将 original 乘以 2 &#xff0c;得到新 origin…

C#——正则表达式详情

正则表达式 正则表达式: 列如判断一个字符串是不是手机号&#xff0c;或者密码是否包含大小写数字等这些要求&#xff0c;可以把这些条件写成一个表达式 创建正则表达式 string s1 "1234adsab1KHGFJD"; // 创建正则时需要在字符串前面加上 Regex r new Regex(&q…

NettyのNIOBIO原理解析

1、IO模型 在IO模型中&#xff0c;主要可分为同步与异步操作&#xff1a; 在同步 I/O 模型中&#xff0c;I/O 操作是阻塞的&#xff0c;当一个进程或线程执行 I/O 操作时&#xff0c;它会一直等待这个操作完成才继续执行后续的代码。 在异步 I/O 模型中&#xff0c;I/O 操作是非…

Shiro有key但无回显利用链子-JRMP大法

前言 shiro在手天下我有&#xff0c;扫出key直接梭哈getshell&#xff0c;横扫内网。但要是像这种情况&#xff0c;直接下班拜拜跑路&#xff0c;没有链子玩毛线… 直到出现了这么一个工具可以通过JRMP协议探测是否存在漏洞&#xff0c;很显然上面工具是做不到的&#xff0c;实…

Cheat Engine 学习

文章目录 Exact Value scanning任务实现步骤Unknown initial value任务实现步骤原理说明Floating points任务实现步骤原理说明Code finder任务实现步骤原理说明Pointers任务实现步骤原理说明Change Pointer 操作:Active(活跃状态)和数值修改:Code Injection任务概述实现步骤…

2024年【四川省安全员C证】考试题及四川省安全员C证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员C证考试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员C证考试资料&#xff0c;安全生产模拟考试一点通上四川省安全员C证作业手机同步练习。2024年【四川省安全员C证】考试题及四川省安全员…

算法训练 | 动态规划Part2 | 62.不同路径、63.不同路径 II

目录 62.不同路径 动态规划法 63. 不同路径 II 动态规划法 62.不同路径 题目链接&#xff1a;62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法 解题思路 机器人从(0 , 0) 位置出发&#xff0c;到(m - 1, n - 1)终点。…

博客没人看啊?我分析是这些原因

1.封面 主题封面还是个性化封面&#xff1f;主题封面对系列化很友好&#xff0c;如下图左&#xff1a; 在目录中什么主题一目了然&#xff0c;个性化封面在目录中就略显杂乱。但是通过观察CSDN主页发现热榜文章清一色个性化封面。如果使文字封面就会显得很无聊。 所以从提高浏…

赶紧收藏!2024 年最常见 20道并发编程面试题(七)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;六&#xff09;-CSDN博客 十三、什么是线程局部存储&#xff08;Thread-Local Storage&#xff09;&#xff1f; 线程局部存储&#xff08;Thread-Local Storage&#xff0c;简称TLS…

[渗透测试学习] IClean-HackTheBox

IClean-HackTheBox 信息搜集 nmap扫描一下 nmap -sV -v 10.10.11.12 -Pn扫描结果 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.52 ((Ubuntu)) Service Info:…

Ubuntu 22.04,把软件更新源更改为阿里或者清华镜像

通常这应该是装上系统后做的第一件事&#xff0c;阿里/清华二选一&#xff0c;本人亲测&#xff0c;可以成功 可以通过修改系统的/etc/apt/sources.list文件来完成。以下是详细步骤&#xff1a; 修改/etc/apt/sources.list 打开终端。 备份当前的/etc/apt/sources.list文件&…

WPF第三方开源UI框架:打造独特体验的魔法师

引言 在WPF&#xff08;Windows Presentation Foundation&#xff09;的世界中&#xff0c;除了微软提供的原生控件&#xff0c;还有许多第三方开源UI框架为开发者提供了更广阔的天地。这些框架以其创新和灵活性&#xff0c;帮助开发者打造出与众不同的用户体验。本文将带您走进…

HashMap 源码解析

1. 基本结构 HashMap 的核心是一个数组&#xff0c;每个数组元素是一个链表或红黑树&#xff08;JDK 1.8 及以后&#xff09;。当哈希冲突发生时&#xff0c;链表或红黑树用于存储多个键值对。 // HashMap的基本结构 public class HashMap<K, V> extends AbstractMap&l…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

金融科技:推动保险行业数字化转型的引擎

随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;已经成为推动金融行业变革的重要力量。特别是在保险行业&#xff0c;金融科技正引领着一场深刻的数字化转型&#xff0c;为保险公司带来了前所未有的机遇与挑战。本文将探讨金融科技如何推动保险行业的数…