斗门区住房和城乡建设网站,php做网站子页模板,淘宝网站建设特点,怎么做网站注册名密码目录 反射反射相关类获取类中属性相关方法常用获得类相关的方法示例常用获得类中属性相关的方法示例获得类中注解相关的方法 反射优缺点 枚举常用方法优缺点 枚举与反射lambda表达式语法函数式接口简化规则使用示例变量捕获集合中的应用优缺点 反射
Java的反射#xff08;refl… 目录 反射反射相关类获取类中属性相关方法常用获得类相关的方法示例常用获得类中属性相关的方法示例获得类中注解相关的方法 反射优缺点 枚举常用方法优缺点 枚举与反射lambda表达式语法函数式接口简化规则使用示例变量捕获集合中的应用优缺点 反射
Java的反射reflection机制是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意方法和属性既然能拿到那么我们就可以修改部分类型信息这种动态获取信息以及动态调用对象方法的功能称为java语言的反射reflection机制。
反射相关类
类名用途Class类代表类的实体在运行的Java应用程序中表示类和接口Field类代表类的成员变量/类的属性Method类代表类的方法Constructor类代表类的构造方法
获取类中属性相关方法
常用获得类相关的方法
方法用途getClassLoader()获得类的加载器getDeclaredClasses()返回一个数组数组中包含该类中所有类和接口类的对象(包括私有的)forName(String className)根据类名返回类的对象newInstance()创建类的实例getName获得类的完整路径名字
示例
获取类有以下三种方法
通过getClass获取Class对象
类名 对象名 new 类名();//初始化一个对象
Class 类变量名 对象名.getClass();直接通过 类名.class 的方式得到。该方法最为安全可靠程序性能更高 这说明任何一个类都有一个隐含的静态成员变量 class Class 类变量名 类名.class;通过 Class 对象的 forName() 静态方法来获取用的最多 但可能抛出 ClassNotFoundException 异常
try {Class 类变量名 Class.forName(包名.类名);
} catch (ClassNotFoundException e) {e.printStackTrace();
}常用获得类中属性相关的方法
方法用途getField(String name)获得某个公有的属性对象getFields()获得所有公有的属性对象getDeclaredField(String name)获得某个属性对象getDeclaredFields()获得所有属性对象
示例
获取私有构造方法展示核心代码要捕获异常
//第一步调用获取方法参数与构造方法的类型的.class
ConstructorT constructor c1.getDeclaredConstructor(String.class , int.class);
//第二步由于是私有的就要设置为可访问相当于获取权限
constructor.setAccessible(true);
//第三步使用构造方法获取一个对象
Object o constructor.newInstance(kun,2.5);
获得类中注解相关的方法
方法用途getAnnotation(Class annotationClass)返回该类中与参数类型匹配的公有注解对象getAnnotations()返回该类所有的公有注解对象getDeclaredAnnotation(Class annotationClass)返回该类中与参数类型匹配的所有注解对象getDeclaredAnnotations()返回该类所有的注解对象
反射优缺点
优点
对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法增加程序的灵活性和扩展性降低耦合性提高自适应能力反射已经运用在了很多流行框架如Struts、Hibernate、Spring 等等。
缺点
使用反射会有效率问题。会导致程序效率降低。反射技术绕过了源代码的技术因而会带来维护问题。反射代码比相应的直接代码更复杂 。
枚举
枚举是在JDK1.5以后引入的。 主要用途是将一组常量组织起来在这之前表示一组常量通常使用定义常量的方 式public static final 枚举语法类内方法外
public enum 枚举名{RED,BLACK,GREEN;//定义的都相当于常量
}常用方法
方法用途values()以数组形式返回枚举类型的所有成员ordinal()获取枚举成员的索引位置valueOf()将普通字符串转换为枚举实例compareTo()比较两个枚举成员在定义时的顺序
枚举的构造方法默认是私有的且只能是私有的。
优缺点
优点
枚举常量更简单安全 。枚举具有内置方法 代码更优雅 。
缺点 不可继承无法扩展 。
枚举与反射
当我们按照前面获取构造方法的方法获取枚举的构造方法时汇报异常java java.lang.NoSuchMethodException 看源码会知道是因为除了我们自己的构造函数参数外他默认后边还会给参数也就是说这里我们参数给少了。 正确给参数后还是会报java.lang.IllegalArgumentException 原因是newInstance方法源码中有如下判断
lambda表达式
Lambda表达式是Java SE 8中一个重要的新特性。 lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式Lambda expression基于数学中的λ演算得名也可称为闭包Closure。
语法
(parameters) - expression 或 (parameters) -{ statements; } paramaters类似方法中的形参列表这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。-可理解为“被用于”的意思。方法体可以是表达式也可以代码块是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回这里的代码块块等同于方法的方法体。如果是表达式也可以返回一个值或者什么都不返回。
函数式接口
一个接口有且只有一个抽象方法其他无关。 函数式接口可以加上FunctionalInterface注解,加上后idea会自动帮你检验。
简化规则
参数类型可以省略如果需要省略每个参数的类型都要省略。参数的小括号里面只有一个参数那么小括号可以省略如果方法体当中只有一句代码那么大括号可以省略如果方法体中只有一条语句且是return语句那么大括号可以省略且去掉return关键字。
使用示例
MoreParameterNoReturn moreParameterNoReturn ( a, b)-{System.out.println(无返回值多个参数省略参数类型a b);
};OneParameterNoReturn oneParameterNoReturn a -{System.out.println(无参数一个返回值,小括号可以胜率 a);
};NoParameterNoReturn noParameterNoReturn ()-System.out.println(无参数无返回值方法体中只有一行代码);变量捕获
lambda可以自动捕获上层的变量。 但是捕获到的变量不能够在修改修改就会报错。
public static void main(String[] args) {int a 10;NoParameterNoReturn noParameterNoReturn ()-{// a 99; errorSystem.out.println(捕获变量a);};noParameterNoReturn.test();
}集合中的应用 优缺点
优点
代码简洁开发迅速方便函数式编程非常容易进行并行计算Java 引入 Lambda改善了集合操作
缺点
代码可读性变差在非并行计算中很多计算未必有传统的 for 性能要高不容易进行调试