20201018_陈宇_

日志

学习总结:

Class:

​ Java.lang.Class表示正在运行的Java应用程序中的类或接口

​ Class是一个泛型类,如String就是一个Class对象,表示的是Class

获取Class:

​ 一共三种方法:

​ 1.Object 中有 getClass() 方法,是获取该对象类型的 Class 对象

​ 2.通过类的class 属性(域) 对象.class

​ 3.通过类的Class类的forName()获取:

​ forName(String name) 中 name 指要获取的 Class 类的全限定类名,此方法会抛出一个 ClassNotFoundException 异常,如果传的参数不是全限定类名或正确的全限定类名都会抛出此异常

获取Class对象中的构造方法:

​ public Constructor getConstructor(Class… parameterTypes):

​ 通过参数来获取某一个 public 构造方法,其中 parameterTypes 是构造方法中参数的类型的 Class , 是一个可变参表示可以不传,不传就是无参构造

​ 此方法会抛出的两个异常:

​ 1. java.lang.NoSuchMethodException 表示没有符合要求的构造方法,一般抛出此方法是因为参数传递不正确

​ 2. java.lang.SecurityException 如果安全管理器,S存在,并且调用者的类加载器是不一样或类加载器的当前类和调用的祖先s.checkPackageAccess()拒绝访问包这个类的

​ public Constructor[] getConstructors():

​ 此方法返回 Class 对象中的所有 public 构造 方法

​ public Construction getDeclaredConstruction(Class<?>… parameterTypes):

​ 获取声明的构造方法,与修饰符无关

​ public Constructor[] getDeclaredConstructors():

​ 获取所有声明的构造方法

获取Class对象中的方法:

​ public Method getMethod(String name, Class… parameterTypes):

​ 返回一个方法对象,它反映此表示的类或接口的指定公共成员方法类对象

​ name指方法名称,parameterTypes参数是以声明顺序标识方法的形式参数类型的类对象的数组,是一个可变参

​ public Method[] getMethods():

​ 返回Class对象所有公共方法类对象数组,包括那些由类或接口和那些从超类和超接口继承的声明

​ public Method getDeclaredMethod(String name, Class… parameterTypes):

​ 获取声明的方法,和修饰符无关

​ public Method[] getDeclaredMethods():

​ 获取所有声明的方法

获取Fileds域:

​ 域也就是我们常说的属性

​ public Field getField(String name) 根据名称获取 public 属性

​ public Field[] getFields() 获取所有 public 属性

​ public Field getDeclaredField(String name) 获取声明的属性

​ public Field[] getDeclaredFields() 获取所有声明的属性

获取注解:

​ public A getAnnotation(Class annotationClass) 获取注 解,如果不存在就是 null

​ public Annotation[] getAnnotations() 获取所有注解

​ public Annotation[] getDeclaredAnnotations()

获取其他信息:

​ getName() 获取本类名称(全限定类名)

​ public native Class getSuperclass() 返回此类的父类对象

​ public String getSimpleName() 返回类的简称

​ public Package getPackage() 返回 Package 对象

​ public native int getModifiers() 返回类的修饰符的整数形式,可以使用java.lang.reflect.Modifier 的 toString(int) 查看

​ public Class[] getInterfaces() 所有实现的接口数组

​ public Class[] getClasses() 获取Class对象的public内部类

​ public Class[] getDeclaredClasses() 获取Class对象所有的内部类

创建对象:

​ 两种方式:

​ 1.使用 Class 对象的 newInstance() 方法创建对象

​ 2.使用 Constructor 对象创建对象

​ 使用 newInstance() 要注意, Class对象中必须要有且可访问的无参构造方法(默认构造)

​ newInstance 方法的参数是可变参,对应我们 getConstructor 方法的参数

访问类的属性(域):

​ java.lang.reflect.Field 类的对象可以提供类或接口的单个字段的信息和动态访问,反射的字段可以是类( static )字段或实例字段

​ public Object get(Object obj) obj 是要获取那个对象的值

​ public int getModifiers() 获取访问修饰符

​ public void setAccessible(boolean flag):

​ Field 类中的一个static方法,它可以设置 Field[] 的访问权限,参数为 true 时表示可访问/操作

​ set(Object obj, Object value) 设置 obj 对象的值为 value

访问类的方法:

​ java.lang.reflect.Method 类提供了操作对象的方法

​ public int getModifiers() 获取修饰符

​ public String getName() 获取方法名

​ public int getParameterCount() 获取参数个数

​ public Class[] getParameterTypes() 获取参数类型

​ public Class getReturnType() 获取返回值类型

​ public Object invoke(Object obj, Object… args) 执行方法,返回值是方法的返回值

​ public String toString() 以字符串形式返回方法信息

Array类动态创建和访问数组:

​ java.lang.reflect.Array 提供静态方法来动态创建和访问Java数组

动态创建:

​ public static Object newInstance(Class componentType, int length)

​ componentType 表示数组类型 length表示数组长度

​ public static native Object get(Object array, int index):

​ 返回 array 中下标为 index 的值

​ public static native XXX getXXX(Object array, int index):

​ 返回 array 中下标为 index 相应类型的值 XXX 是基本数据类型

​ public static native void set(Object array, int index, Object value):

​ public static native void setXXX(Object array, int index, XXXb):

​ 设置 array 中下标为 index 的值为value XXX是基本数据类型

​ public static native int getLength(Object array):

​ 返回array的长度

getxxxs()和getDeclaredxxxs()方法的区别:

​ getXXXs() 返回当前 Class 对象所有的 public 修饰的,包括父类中继承到的方法

​ getDeclaredXXXs() 返回当前 Class 对象所有声明的,不包括父类中继承到的方法(只能是自己声明的)

注解的概念:

​ 注解是 JDK 1.5 的特性

​ 注解是 java 代码中的特殊标记,是类的组成部分,可以携带一些特殊信息

​ 注解可以加在包、类、字段、方法、方法参数以及局部变量上

​ 注解是给编译器或 JVM 看的,编译器或 JVM 可以根据注解来完成相应的功能

​ 注解的形式是以 @ 符号开头,我们已经见过的注解有:@Override/@Suppersswarnings("serial")等

注解的作用:

​ 从 JVM 的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定

​ java注解分为4类:

​ 1.由编译器使用的注解:

​ @Override :让编译器检查该方法是否正确地实现了覆写(重写)

​ @SuppressWarnings :告诉编译器忽略此处代码产生的警告

这类注解不会被编译进入.class文件,它们在编译后就被编译器去掉了

​ 2.生成文档:

​ 最为常见,也是最早提供的注解

​ 常用的有:

​ @see 、 @param 、 @return、@author 、 @version 等

​ 3.会被编译到.class文件中的注解,这类注解只被一些底层库使用,一般我们不用自己处理

​ 4.在程序运行期能够读取的注解,它们在加载后一直存在于jvm中,这也是最常见的注解,如:

@Deprecated(废弃)

​ 包 java.lang.annotation 中包含所有定义自定义注解所需用到的注解和接口

​ java.lang.annotation.Annotation 是所有注释类型扩展的公共接口,此接口本身并不定义注释类型

属性的作用:

​ 可以让用户在使用注解时传递参数,让注解的功能更加强大

属性的格式:

​ 格式1:数据类型 属性名();

​ 格式2:数据类型 属性名() default 默认值;

​ 其中数据类型可以是:

​ 八种基本数据类型

​ String类型,Class类型,枚举类型,注解类型

​ 以上所有类型的一维数组

使用注解:

​ 如果属性有默认值,则使用注解的时候,这个属性可以不用赋值

​ 如果属性没有默认值,那么在使用注解时一定要给属性赋值

​ 如果注解只有一个 value 属性,那么可以直接赋值不用写属性名

元注解:

​ 简单说定义注解的注解就是元注解

​ java 中提供了一些元注解,它们都在 java.lang.annotation 包 中,分别是:

​ @Target :指明此注解用在哪个位置,如果不写默认是任何地方都可以使用(常用)

​ @Retention :定义该注解的生命周期(有效范围)(常用)

​ @Documented :指定被其修饰的注解将被 javadoc 工具提取成文档,此注解没有成员

​ @Inherited :子类是否可继承父类定义的 Annotation , @Inherited 仅针对

​ @Target(ElementType.TYPE) 类型的 annotation 有效,并且仅针对 class 的继承,对 interface 的继承无效

​ @Repeatable :表示这个注解可以重复使用,使用并不是太广

@Target:

​ @Target 注解类型只有一个唯一的成员 value ,这个成员是 java.lang.annotation.ElementType 类 型的,常用的参数值包括:

​ ElementType.ANNOTATION_TYPE :注解类型声明

​ ElementType.TYPE : 用在类,接口(包括注释类型)或枚举声明

​ ElementType.FIELD :用在成员变量上

​ ElementType.METHOD : 用在方法上

​ ElementType.PARAMETER :用在参数上

​ ElementType.CONSTRUCTOR :用在构造方法上

​ ElementType.LOCAL_VARIABLE :用在局部变量上

​ ElementType.PACKAGE :用在包上

​ 多个值之间使用,隔开

@Retention:

​ value 中的值是 java.lang.annotation.RetentionPolicy 枚举类,可选值为:

​ SOURCE :注解只存在于Java源代码中,编译生成的字节码文件中就不存在了

​ CLASS :注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值

​ RUNTIME :注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过 反射获取该注解

注解解析:

​ 通过 Java 技术获取注解数据的过程则称为注解解析

​ Anontation :所有注解类型的公共接口,类似所有类的父类是Object

​ AnnotatedElement :定义了与注解解析相关的方法,常用方法以下四个:

image-20201018194650756

学习心得:

​ 经历了昨天的考试,考出来的成绩非常低,在考试的过程中,我发现自己其实还有很多知识没有牢牢的掌握,或没有完全掌握,导致自己在做题的时候速度慢,且犹豫不决,看来基础知识是非常重要的,还有浩哥总结的知识点也没怎么看,总之确实懒了些吧。

标签

评论

this is is footer