day24
一、反射获取成员变量
1.public Field[] getFields() 获取公有的成员变量
2.public Field[] getDeclaredFields() 获取所有的成员变量
3.public Field getField(String name) 获取单个的成员变量
4.public Field getDeclaredField(String name) 获取指定的成员变量,包括私有的成员变量
成员变量类:
package com.lt.demo05;
public class Student {
public String name;
private int age;
// protected int sex;
}
代码-测试类:
package com.lt.demo05;
import javax.naming.Name;
import java.lang.reflect.Field;
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
//获取Student对象的class对象
Class<?> aClass = Class.forName("com.lt.demo05.Student");
//获取class对象的所有的公有的成员变量
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("********************");
//获取所有的成员变量
Field[] fields1 = aClass.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
System.out.println("************************");
//获取单个的成员变量,传的参数是你需要寻找的属性名
Field field = aClass.getField("name");
System.out.println(field);
System.out.println("******************");
//可以获取指定的成员变量,包括私有的成员变量
Field age = aClass.getDeclaredField("age");
Field age01 = aClass.getDeclaredField("name");
System.out.println(age);
System.out.println(age01);
}
}
二、jdk1.8的四个接口
1.Supplier接口(供给型接口):方法
T get() 得到一个结果
2.Consumer消费型接口:方法
A.void accept(T t) 在给定的参数上执行此操作(消费的方法)
B.default Consumer andThen(Consumer<? super T>after)
可以连接多个消费型接口(可以进行多次消费)
3.Predicate 断言型接口 用于来进行判断
A.boolean test(T t) 用于来进行做判断
B.default Predicate and(Predicate<? super T> other) 并且 &&
C.default Predicate or(Predicate<? super T> other) 或者 ||
D.default Predicate negate() 非 !
4.Funtion函数型接口:转换型
A.default Function<T,V> andThen(Function<? super R,? extends V>after)
链接多喝函数型接口
B.R apply(T t) ==>将T类型转换为R类型 用于进行转换
三、stream
1.stream是一个接口,主要用于来进行数据筛选,过滤,相当于流水线
2.stream提供了两类方法:延迟方法(返回的是stream,还可以在上面进行操作)
终结方法(返回值不是Stream,后面不能进行操作)
3.1 获取stream对象
1.default Stream stream() 只有单列集合可以使用这个方法(Collection以及其子类)
2.static Stream of(T... values) 数据转换成stream对象
案例
package com.lt.demo06;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Test01 {
public static void main(String[] args) {
//集合转换成stream对象
List<String> li = new ArrayList<>();
li.add("张三");
li.add("李四");
li.add("王五");
li.stream().forEach((s)->{
System.out.println(s);
});
//Integer类型的数据转换成stream对象
Stream.of(10,31,51,12).forEach((Integer i)->{
System.out.println(i);
});
}
}
3.2 常用的方法
1.Stream filter(Predicate<? super T> predicate)
表示对数据进行过滤(是延迟方法)
2.void forEach(Consumer<? super T> action)
对stream的书局进行遍历(是延迟方法)
3.long count() 返回stream对象的元素个数(不是延迟方法)
4.Stream limit(long maxSize)
返回值的长度的stream的元素(是延迟方法)
5.Stream map(Function<? super T,? extends R>mapper)
用来做数据转换(是延迟方法)
6.Stream skip(long n) 跳过指定长度的元素(是延迟方法)
7.static Stream concat(Stream<? extends T> a,Stream<? extends T> b)
将两个stream对象合并成一个stream对象(是延迟方法)
四、注解
4.1 简介
1.注释:用于来解释代码,主要用于来给程序查看
2.注解:用于对代码进行解释说明,主要用于给jvm来进行查看
3.定义:注解(Annotation)也叫元数据, 是一种代码级别的说明,是jdk1.5之后引入的一个新特性,与类、接 口、枚举是一个层次的 它可以声明在包、类、方法、字段、局部变量和方法的参数前面
用于对这些元素进行说明 注释
A.是jdk1.5之后的新特性 B.对元素进行说明注释 C.注解:元数据
4.作用分类:
A.编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
B.代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
C.编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
4.2 jdk提供了三个注解
1.@Override 用于检查是否是重写的方法
2.@Deprecated 用于来标注是过时的方法 但是这个方法还是可以使用 例如:Thread线程里面的stop()方法
3.SuppressWarnings 压制黄色的警告线
SuppressWarnings("all") 压制所有的黄色的警告线 可以定义在类上 也可以定义方法上 还可以定义在属性上
4.3 自定义注解
1.定义:
a.元注解
b.public @interface SuppressWarnings {}
2.本质:一个接口,一个注解在虚拟机里面编译后,进行反编译(反编译:javap 类名.class文件)
public interface My extends java.lang.annotation.Annotation {}(反编译后得到的)
3.接口里面的成员:常量(不关注) 抽象方法(重点关注)==>注解中的成员方法称为属性
4.注解中的属性的返回值类型:
A.基本数据类型 四类八种
B.引用数据类型
C.string类型
D.枚举类型
E.注解类型
F.以上类型的数组类型
5.注意点:
A.使用注解的时候 必须给所有的属性(抽象方法)进行赋值
B.使用注解的时候,如果没有给属性进行赋值,那么设置为默认值
C.使用注解给数组进行赋值,设置多个值可以使用大括,单个值时候可以省略大括号
D.如果注解只有一个,而且这个注解的属性名为value,使用注解的时候,可以省略属性名,直接进行赋值
注解:
package com.lt.demo07;
/**
* @author 悲陌
*/
public @interface Anno {
int show01();
// Color show02();
String show03();
String[] show04();
}
枚举:
package com.lt.demo07;
public enum Color {
}
测试类:
package com.lt.demo07;
@Anno(show01 = 19,show03 = "马儿" ,show04 = {"乌龟","母乌龟"})
public class Test01 {
}
4.4 元注解
使用:
1.@Target 主要用于来表示注解作用的位置
TYPE 表示在类上面可以使用
FIELD 表示在属性上可以使用
METHOD 表示在方法上可以使用
2.@Retention 主要用于注解是否可以被识别
RUNTIME 表示项目在运行的时候 jvm可以识别这个注解
3.@Inherited 用于表示注解是否继续被子类继承的使用
4.@Documented 用于标注是否在api文档上显示这个注解