【Java基础】Java的反射、注解、lambda表达式

文章目录

  • 1. 反射
    • 1.1 反射演示
    • 1.2 反射原理
  • 2. Class类
  • 3. 注解
    • 3.1 内置注解
    • 3.2 元注解
    • 3.3 自定义注解
  • 4. lambda表达式
  • 5. lambda精简
  • 6. lambda调用方法

1. 反射

1.1 反射演示

有一个猫类,如下:

public class Cat {private String name;private int age;public void speak(){System.out.println("猫不会说话");}public void climb(){System.out.println("猫会爬");}public Cat() {}public Cat(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

假设我们配置属性文件re.properties:

className=Cat
methodName=speak

编写反射的主方法,首先先读取配置文件,然后根据配置文件写的类路径、类方法来获取类:

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class tmp {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {
//        读取配置文件Properties properties = new Properties();properties.load(new FileInputStream("re.properties"));
//        加载配置文件中的属性String className = properties.getProperty("className");String methodName = properties.getProperty("methodName");Class cls = Class.forName(className); // 根据类的路径获取类Object obj = cls.newInstance(); // 获取这个类的实例Method method = cls.getMethod(methodName); // 获取类里面的方法method.invoke(obj); // 调用类里面的方法}
}

根据目前的位置,输出是:

猫不会说话

反射的作用是,如果我们修改配置文件里面的方法名为climb,则可以使得输出为:

猫会爬

这样就可以使得我们只修改配置文件而无需修改源码,实现代码功能的改变。

1.2 反射原理

.java文件经过编译器编译后变成了.class字节码文件,.class文件里面编译了.java文件里面的所有东西,有类、属性、方法、构造方法等。

Java程序的加载就是加载.class文件,.class文件被加载进内存后,内存里边有一个.class文件对应的内存区域,内存中包含了.class文件中所有与.java对应的类、属性、方法、构造方法等

通过内存区域内的这些对应的东西进行反射加载,获得具体的类、方法等。

2. Class类

Class.forName(classPath)加载出来的两个结果属于同一个对象,HashCode相等

3. 注解

3.1 内置注解

@SuppressWarnings("all")可以注释在类、方法等上表示抑制编译器的所有类型警告,unchecked表示抑制单类型的警告,unchecked,rawtypes表示抑制多类型的警告

@Override是重载方法,比如用在toString()方法上

@Deprecated表示是一个过时的方法,不推荐使用,当使用这个方法时,方法上会被标记一个删除线

3.2 元注解

@Target表示在哪些位置上标记注解:@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER...})

@Retention:指定注解的声明周期,如:@Retention(RetentionPolicy.RUNTIME)

@Document:会在JavaDoc里出现

3.3 自定义注解

自定义注解的代码,使用元注解:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NodeU{
}

4. lambda表达式

通过lambda表达式自定义实现接口的方法,并调用打印结果

public class tmp {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {Dog d = (int a, int b) -> {return a + b;};System.out.println(d.add(3, 2));}
}interface Dog{int add(int a, int b);
}

如果interface里面有多个方法:

interface Dog{int add(int a, int b);int sub(int a, int b); // 二义性int mul(int a, int b); // 二义性
}

则主方法里的写法就会有问题,因为(int a, int b)不知道具体指的是哪个。

5. lambda精简

void方法可以精简成:

public class tmp {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {Dog d = () -> System.out.println("aaa");d.add();}
}interface Dog{void add();
}

精简4中的代码:

public class tmp {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {Dog d = (a,b)->(a + b);System.out.println(d.add(3, 2));}
}interface Dog{int add(int a, int b);
}

又如:

public class tmp {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {Dog d = a-> System.out.println("a" + a);d.add("1");}
}interface Dog{void add(String a);
}

单个参数可以不带括号,但是多个参数必须带括号。这个要求是Dog接口的方法里只有一个含一个参数的方法,否则会报错

  • 一个参数时,()可省略

  • 方法体只有一条语句时,{}可省略

  • 如果方法体是return,那省略同时return也要省略

  • 参数类型可以省略(String a)可以直接变为(a)

6. lambda调用方法

大概就是将类tmp中的method方法,作为接口Dog中类似方法的实现(method是以两个int为参数的方法,而Dog中恰好有两个int的方法)

public class tmp {public static void main(String[] args) {tmp _tmp = new tmp();Dog d = _tmp::method;System.out.println(d.add(1, 2));System.out.println(d.add(3, 4));System.out.println(d.add(6, 5));}public int method(int a, int b){return a+b;}
}interface Dog{int add(int a, int b);
}

如果dog中多了一个也是两个int参数的方法,则Dog d = _tmp::met中就会报错。

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

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

相关文章

IDEA2023.1.1中文插件

1.启动IDEA 选中Customize 2.选择All settings 3.选中Plugins,再搜索栏里输入Chinese,找到 "Chinese (Simplified) Language"插件,点击 Install 进行安装。 4. 安装完成后,重启IntelliJ IDEA,即可看到界面语言已经变为中文。

JavaScript 函数定义和调用

在JavaScript中,定义函数的方式如下: function abs(x) { if (x > 0) { return x; } else { return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义; abs是函数的名称; (x)括号内列出函数的参数&am…

Springboot 集成 dynamic-datasource-spring-boot-starter,实现项目中原有的数据源作为主数据源

Springboot 集成 dynamic-datasource-spring-boot-starter&#xff0c;实现项目中原有的数据源作为主数据源 保证原有项目中在执行数据库操作时&#xff0c;默认使用原有数据源&#xff0c;新数据源做特定操作 引入多数据源切换依赖&#xff1a; <dependency><grou…

JavaScript(一)基础

文章目录 一、JS介绍JavaScript是什么JavaScript书写位置JavaScript的注释输入输出语法字面量 二、变量变量是什么变量基本使用变量的本质变量命名规则与规范变量拓展-数组var与let的区别 三、常量四、数据类型数据类型检测数据类型数据类型转换隐式转换显式转换 简单运算符断点…

【洛谷 P8695】[蓝桥杯 2019 国 AC] 轨道炮 题解(映射+模拟+暴力枚举+桶排序)

[蓝桥杯 2019 国 AC] 轨道炮 题目描述 小明在玩一款战争游戏。地图上一共有 N N N 个敌方单位&#xff0c;可以看作 2D 平面上的点。其中第 i i i 个单位在 0 0 0 时刻的位置是 ( X i , Y i ) (X_i, Y_i) (Xi​,Yi​)&#xff0c;方向是 D i D_i Di​ (上下左右之一, 用…

【详细注释+流程讲解】基于深度学习的文本分类 TextCNN

前言 这篇文章用于记录阿里天池 NLP 入门赛&#xff0c;详细讲解了整个数据处理流程&#xff0c;以及如何从零构建一个模型&#xff0c;适合新手入门。 赛题以新闻数据为赛题数据&#xff0c;数据集报名后可见并可下载。赛题数据为新闻文本&#xff0c;并按照字符级别进行匿名…

同步检查继电器 JT-1/200 100V 面板嵌入式安装,板后接线

系列型号 JT-1同步检查继电器&#xff1b; DT-1同步检查继电器&#xff1b; JT-3同步检查继电器&#xff1b; DT-3同步检查继电器&#xff1b; 一、应用范围 JT(DT)系列同步检查继电器用于两端供电线路的自动重合闸线路中&#xff0c;以检查线路上电压的存在及线路上和变电站汇…

基于Spring Boot的在线考试系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Go语言时间编程

1.时间元素编程 时间是一个重要的编程元素,可用于计算、同步服务器以及测量。Go语言标准库提供了time包,其中包含用于同当前时间交互以及测量时间的函数和方法。 在编程中,时间通常被称为“实时” “过去的时间” 和 “壁挂钟” 。对于术语“壁挂钟”,可将其视为挂在墙上的…

element-ui breadcrumb 组件源码分享

今日简单分享 breadcrumb 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、breadcrumb 组件页面结构 2、breadcrumb 组件属性 3、breadcrumb 组件 slot 一、breadcrumb 组件页面结构 二、breadcrumb 组件属性 2.1 separator 属性&#xff0c;分隔符&#xff…

程序员沟通之道:TCP与UDP之辩,窥见有效沟通的重要性(day19)

程序员沟通的重要性&#xff1a; 今天被师父骂了一顿&#xff0c;说我不及时回复他&#xff0c;连最起码的有效沟通都做不到怎么当好一个程序员&#xff0c;想想还挺有道理&#xff0c;程序员需要知道用户到底有哪些需求&#xff0c;用户与程序员之间的有效沟通就起到了关键性作…

PCL 计算直线到三角形的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路相对就简单很多了,主要有之前的积累: 1、首先,我们可以判断直线与三角形是否相交,相交则距离为0,这里可以参考之前的博客:PCL 计算一条射线与一个三角形的交点。 2、如果直线与三角形未相交,则只需…

Java多态世界(day18)

多态&#xff1a;重写的方法调用和执行 1.静态绑定&#xff1a;编译器在父类中找方法&#xff0c;如&#xff1a; 上面的eat&#xff08;&#xff09;方法是先在父类中找方法&#xff0c;父类没有的话&#xff0c;就算子类有编译也会报错。&#xff08;如果引用方法在父类中存…

UE4_普通贴图制作法线Normal材质

UE4 普通贴图制作法线Normal材质 2021-07-02 10:46 导入一张普通贴图&#xff1a; 搜索节点&#xff1a;NormalFromHeightmap 搜索节点&#xff1a;TextureObjectparameter&#xff0c;并修改成导入的普通贴图&#xff0c;连接至HeightMap中 创建参数normal&#xff0c;连接…

世界各国各行业全球价值链数据集(2007-2021年)

01、数据介绍 在全球化的浪潮下&#xff0c;世界各国各行业都深深地融入了全球价值链中&#xff0c;共同构建了一个复杂而精细的网络。这个网络不仅连接了各国的经济体系&#xff0c;也促进了全球贸易和合作的繁荣发展。 在发达国家&#xff0c;他们凭借先进的科技、高端人才…

Dockerfile详解构建镜像

Dockerfile构建企业级镜像 在服务器上可以通过源码或rpm方式部署Nginx服务&#xff0c;但不利于大规模的部署。为提高效率&#xff0c;可以通过Dockerfile的方式将Nginx服务封装到镜像中&#xff0c;然后Docker基于镜像快速启动容器&#xff0c;实现服务的快速部署。 Dockerf…

【Vue3】el-checkbox-group实现权限配置和应用

一. 需求 针对不同等级的用户&#xff0c;配置不同的可见项 配置效果如下 &#xff08;1&#xff09;新增&#xff0c;获取数据列表 &#xff08;2&#xff09;编辑&#xff0c;回显数据列表 应用效果如下 &#xff08;1&#xff09;父级配置 &#xff08;2&#xff09;子级…

Cloudflare Workers

Cloudflare Workers 一、由来和历史 Cloudflare Workers是Cloudflare提供的一项边缘计算服务&#xff0c;它允许开发者在全球分布的Cloudflare数据中心运行JavaScript代码&#xff0c;实现灵活的边缘逻辑处理。Workers最初于2017年推出&#xff0c;是Cloudflare推动边缘计算和…

提速又稳定:使用国内镜像源加速 pip 安装软件包

文章目录 前言国内镜像源使用方式个人简介 前言 当涉及到 Python 开发时&#xff0c;使用 pip 安装软件包已经成为家常便饭。但是很多开发者都会遇到一个共同的问题&#xff1a;国外源下载速度慢&#xff0c;不仅浪费时间&#xff0c;而且经常导致安装失败。为了解决这个问题&…

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…