Java高级特性

news2024/11/29 9:49:01

引言

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 {
    @Inject
    private 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.coloradmin.cn/o/1825032.html

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

相关文章

AntDB数据库中级认证(ACP)题库

单项选择题 共35题&#xff0c;大题得分&#xff1a;62.0&#xff0c;大题满分&#xff1a;70.0 1.函数计算外移的作用&#xff1f; A. 增加计算量 B. 减少计算量 C. 减少冗余查询 D. 改变关联顺序 2.0&#xff08;本题分数&#xff1a;2.0&#xff09; 学员答案&#…

Stable Diffusion 【AI绘画提示词】摄影效果提示词,超美摄影效果摄影特效!让平凡的照片焕发出独特的魅力!

高端的摄影作品需要的专业设备价格昂贵&#xff0c;并不是一般人能够承受的起的&#xff0c;优质摄影作品对光线等一系列要求也非常的高&#xff0c;而AI摄影就完美的解决了这些问题&#xff0c;只需要配合适当的提示词&#xff0c;这些问题都可以迎刃而解。 AI绘画没灵感&…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站&#xff0c;不得不说这是一个神奇的网站&#xff0c;在这个网站上你可以实现不可思议的各种操作&#xff0c;让我们对网站有了新的认知&#xff0c;因为它告诉你不是所有有趣的网站都那么花哨&#xff0c;有些网站看着外形平淡无奇…

实时交通 | 城市交通态势采集及可视化操作(定时运行)

一、前言 交通态势数据是关于交通状况的一种量化描述&#xff0c;它提供了关于道路网络运行状态的详细信息。交通态势数据指的是根据车流入量和车流出量的定义&#xff0c;衡量整个全局交通区域交通态势的数据。这些数据通常从车辆GPS轨迹数据中提取&#xff0c;包括车辆行驶速…

虚拟淘宝-Virtual-Taobao论文解读(AAAI2019)

目录 1 论文简介 2 文章的主要贡献 3 文章技术的简要说明 4 技术的详细说明 4.1 GAN-SD&#xff1a;生成客户特征 4.2 MAIL&#xff1a;生成交互过程 4.3 ANC&#xff1a;动规范约束 5 实验设定及结果 6 结论 7 参考 1 论文简介 南京大学LAMDA团队的侍竞成、俞扬等…

PDF标准详解(三)—— PDF坐标系统和坐标变换

之前我们了解了PDF文档的基本结构&#xff0c;并且展示了一个简单的hello world。这个hello world 虽然只在页面中显示一个hello world 文字&#xff0c;但是包含的内容却是不少。这次我们仍然以它为切入点&#xff0c;来了解PDF的坐标系统以及坐标变换的相关知识 图形学中二维…

网络安全从入门到精通(特别篇I):应急响应案例

蓝队应急响应实战 1. 应急响应1. 应急响应 获取当前WEB环境的组成架构(语言,数据库,中间件,系统等) 分析思路: 1、利用时间节点筛选日志行为 2、利用已知对漏洞进行特征筛选 3、利用后门查杀进行筛选日志行为 #内容点: 应急响应: 1、抗拒绝服务攻击防范应对指南 2、勒…

小分子水半幅宽检测 低氘水同位素氘检测 富氢水检测

小分子水半幅宽检测 低氘水同位素氘检测 富氢水检测 检测范围: 矿泉水等饮用水 检测概述 小分子团水活化性很强&#xff0c;具有强渗透力&#xff0c;强溶解力&#xff0c;强扩散力。水的含氧量高&#xff0c;能给人体内的组织细胞带来更多的氧。长自来水大分子团核磁共振测得…

论文阅读笔记:DepGraph: Towards Any Structural Pruning

论文阅读笔记&#xff1a;DepGraph: Towards Any Structural Pruning 1 背景2 创新点3 方法4 模块4.1 分组4.2 依赖图4.3 网络分解4.4 依赖建模4.4 组级剪枝 5 效果 论文&#xff1a;https://arxiv.org/pdf/2301.12900 代码&#xff1a;https://github.com/VainF/Torch-Prunin…

Java面试题--JVM大厂篇之掌握JVM性能优化:选择合适的垃圾回收器

掌握JVM性能优化&#xff1a;选择合适的垃圾回收器 引言: ​  在Java开发中&#xff0c;性能优化往往是提高应用稳定性和用户体验的关键所在。而垃圾回收器的选择和优化&#xff0c;是JVM性能调优的核心环节。如何在众多垃圾回收器中选出适合自己应用需求的那一个&#xff1…

6581 太阳能电池板伏安特性测试仪

6581 太阳能电池板伏安特性测试仪 产品综述 6581太阳能电池板伏安特性测试仪主要用于太阳能电池板生产的最终测试&#xff0c;也可以作为层压前测试使用&#xff0c;能大大提高一次封装成品率。该测试仪适合于单晶、多晶、薄膜等多种电池组件&#xff0c;可进行I-V曲线、P-…

进口二手RS FSH4规格3.6G罗德与施瓦茨 FSH6参数

Rohde & Schwarz FSH4 的规格包括&#xff1a; 频率范围从 9 kHz 到 3.6 GHz 高灵敏度&#xff08;<-141dBm&#xff08;1Hz&#xff09;&#xff0c;或使用可选前置放大器<-161dBm&#xff08;1Hz&#xff09;&#xff09; 低测量不确定度&#xff08; 内部跟踪发生…

算法day31

第一题 542. 01 矩阵 本题本来求解的是每一个1到0的最短距离并返回到矩阵之中&#xff1b; 我们采用正难则反的思路&#xff0c;将其化解为每一个0到每一个1的最短距离&#xff0c;并通过矩阵来返回&#xff1b; 解法&#xff1a;多源bfs正难则反 步骤一&#xff1a; 定义一个…

僵尸网络相关

个人电脑被植入木马之后&#xff0c;就会主动的连接被黑客控制的这个C&C服务器&#xff0c;然后这个服务器就会给被植入木马的这个电脑发指令&#xff0c;让他探测在他的局域网内还有没有其他的电脑了&#xff0c;如果有那么就继续感染同局域网的其他病毒&#xff0c;黑客就…

基于单片机的无人监守点滴控制系统设计

摘要 &#xff1a; 在当代社会 &#xff0c; 点滴是一种常用的诊疗方法 。 为了减轻医护人员的压力 &#xff0c; 设计了一种基于单片机的无人监守点滴控制系统&#xff0c; 该系统共由 2 个板子组成 &#xff0c; 其中一个主控板子 &#xff0c; 一个检测板子 。 检测板与…

maven编译【-Dmaven.test.skip=true和-DskipTests=true的区别】

1、背景 我在执行maven编译时&#xff0c;遇到下面情况&#xff1a; 1、当执行命令为下面&#xff1a; mvn clean compile package install -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue -Dra…

救命!挖到宝了,这本计算机书真的巨巨好看

一本适合大学生使用的计算机科学和编程学习指南&#xff0c;它通过丰富的内容和多样的学习形式&#xff0c;帮助学生建立坚实的计算机科学基础&#xff0c;并激发他们对计算机科学的兴趣。 这本书涵盖了多种类型的练习题&#xff0c;旨在帮助读者巩固理论知识并提高实际编程技能…

PostgreSQL下载地址

下载地址&#xff1a;PostgreSQL: File Browser

深入理解ReentrantLock

深入理解ReentrantLock 在Java并发编程中&#xff0c;锁&#xff08;Lock&#xff09;是控制多个线程对共享资源访问的重要工具。虽然Synchronized关键字是实现锁的常用方式&#xff0c;但它在功能上比较有限。ReentrantLock是java.util.concurrent.locks包中提供的一个更加灵…

Python基础教程(十九):网络编程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…