20201018_陈宇_
日志
学习总结:
Class:
Java.lang.Class
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
获取声明的构造方法,与修饰符无关
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 :定义了与注解解析相关的方法,常用方法以下四个:
学习心得:
经历了昨天的考试,考出来的成绩非常低,在考试的过程中,我发现自己其实还有很多知识没有牢牢的掌握,或没有完全掌握,导致自己在做题的时候速度慢,且犹豫不决,看来基础知识是非常重要的,还有浩哥总结的知识点也没怎么看,总之确实懒了些吧。
近期评论