java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JavaSE反射、枚举、lambda表达式

JavaSE反射、枚举、lambda表达式常用方法举例

作者:鸽鸽程序猿

这篇文章主要介绍了JavaSE反射、枚举、lambda表达式常用方法的相关资料,反射允许在运行时检查和操作类、方法和属性,枚举提供了一种更安全和优雅的方式来定义常量,而Lambda表达式则简化了函数式接口的实现,需要的朋友可以参考下

一、反射

1.1 反射相关类

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量/类的属性
Method类代表类的方法
Constructor类代表类的构造方法

1.2 获取类中属性相关方法

1.2.1 常用获得类相关的方法

方法用途
getClassLoader()获得类的加载器
getDeclaredClasses()返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的)
forName(String className)根据类名返回类的对象
newInstance()创建类的实例
getName获得类的完整路径名字

1.2.2 示例

获取类有以下三种方法:

类名 对象名 = new 类名();//初始化一个对象
Class 类变量名 = 对象名.getClass();
 Class 类变量名 = 类名.class;
try {
	Class 类变量名 = Class.forName("包名.类名");
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}

1.2.3 常用获得类中属性相关的方法

方法用途
getField(String name)获得某个公有的属性对象
getFields()获得所有公有的属性对象
getDeclaredField(String name)获得某个属性对象
getDeclaredFields()获得所有属性对象

1.2.4 示例

获取私有构造方法:(展示核心代码,要捕获异常)

//第一步:调用获取方法,参数与构造方法的类型的.class
Constructor<T> constructor = c1.getDeclaredConstructor(String.class , int.class);
//第二步:由于是私有的就要设置为可访问,相当于获取权限
constructor.setAccessible(true);
//第三步:使用构造方法获取一个对象
Object o = constructor.newInstance("kun",2.5);

1.2.5 获得类中注解相关的方法

方法用途
getAnnotation(Class annotationClass)返回该类中与参数类型匹配的公有注解对象
getAnnotations()返回该类所有的公有注解对象
getDeclaredAnnotation(Class annotationClass)返回该类中与参数类型匹配的所有注解对象
getDeclaredAnnotations()返回该类所有的注解对象

1.3 反射优缺点

优点:

缺点:

二、枚举

枚举是在JDK1.5以后引入的。

主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式:public static final枚举语法(类内方法外):

public enum 枚举名{
    RED,BLACK,GREEN;//定义的都相当于常量
}

2.1 常用方法

方法用途
values()以数组形式返回枚举类型的所有成员
ordinal()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序

枚举的构造方法默认是私有的,且只能是私有的。

2.2 优缺点

优点:

缺点: 不可继承,无法扩展 。

三、枚举与反射

当我们按照前面获取构造方法的方法获取枚举的构造方法时汇报异常:java java.lang.NoSuchMethodException看源码会知道是因为除了我们自己的构造函数参数外,他默认后边还会给参数,也就是说,这里我们参数给少了。

正确给参数后还是会报java.lang.IllegalArgumentException原因是newInstance方法源码中有如下判断:

四、lambda表达式

Lambda表达式是Java SE 8中一个重要的新特性。

lambda表达式允许你通过表达式来代替功能接口。

lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。

Lambda 表达式(Lambda expression),基于数学中的λ演算得名,也可称为闭包(Closure)。

4.1 语法

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

4.2 函数式接口

一个接口有且只有一个抽象方法,其他无关。
函数式接口可以加上@FunctionalInterface注解,加上后idea会自动帮你检验。

4.3 简化规则

4.4 使用示例

MoreParameterNoReturn moreParameterNoReturn = ( a, b)->{
        System.out.println("无返回值多个参数,省略参数类型:"+a+" "+b);
};

OneParameterNoReturn oneParameterNoReturn = a ->{
        System.out.println("无参数一个返回值,小括号可以胜率:"+ a);
};

NoParameterNoReturn noParameterNoReturn = ()->System.out.println("无参数无返回值,方法体中只有一行代码");

4.5 变量捕获

lambda可以自动捕获上层的变量。

但是捕获到的变量不能够在修改,修改就会报错。

public static void main(String[] args) {
        int a = 10;
        NoParameterNoReturn noParameterNoReturn = ()->{
            // a = 99; error
            System.out.println("捕获变量:"+a);
       };
        noParameterNoReturn.test();
}

4.6 集合中的应用

4.7 优缺点

优点:

缺点:

总结 

到此这篇关于JavaSE反射、枚举、lambda表达式常用方法的文章就介绍到这了,更多相关JavaSE反射、枚举、lambda表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文