文章目录
一、反射
1.概述
- 面向对象的编程思想
类:从很多对象中抽取出来的公有的特性行为,抽象描述一组对象
对象:在现实生活中存在很多对象,很多相同特征相同行为 - 类是用来描述一组对象的
- 反射机制认为是用来描述一组类的
Class 用来描述类本身
Package 用来描述类所属的包
Filed 用来描述类中的属性
Method 用来描述类中的方法
Constructor 用来描述类中的构造方法
Annotation 用来描述类中的注解@Qverride 注解可以放置在(
类上面,属性上面,方法上面,构造方法上面,参数前)
2.如何获取Class
- 三种方式
Class c = Class.forName("包名.类名");
Class c = 类名.class;
Class c = 对象.getClass();//object类中的方法
3.Class中常用的方法
int result = getModifiers();//获取类的修饰符(权限 特征)
String name = getName();//获取全名(包.类名)
String simpleName = getSimpleName();//获取简单名
Package p = getPackage(); p.getName(); //获取包名
Class s = getSuperClass();//获取父类
Class[] ss =getInterface();//获取所有的实现接口
Object obj = newInstance();//默认调用无参数构造方法创建对象
Field f = getField("属性名");
Field[] fs = getFields();//获取全部的属性
getDeclaredField("属性");//只能获取公有的属性,包括继承的属性
Field[] fs = getDeclaredFields();//可以获取私有属性,可以获取私有和公有属性,但只能获取本类中的
4.Field类中的常用方法
int = getModifers()获取属性的修饰符
Class = getType();获取属性类型
String getName();获取属性的名字
操作属性 向里面存值 set(对象,值)
从里面取值 值 = get(对象)
setAccessable(true);可以修改私有属性的操作
5.如何操作类中的方法
- class类中的方法
Method m = class.getMethod(方法名,"Class...参数列表");获取一个公有方法(本类+父类)
Method[] ms = class.getMethods();获取所有方法(公有 本类+父类)
Method = getDeclaredMethod("方法名字",参数类型列表)获取一个方法(自己类,公有私有)
Method[] = getDeclaredMethods();获取所有方法(本类,公有私有)
获取构造方法
Constructor = getConstructor(class...参数类型列表)
Constructor[] cs = class.getConstructors();
Constructor = getDeclaredConstructor();
Constructor[] = getDeclaredConstructors();
- Method类中的方法
int mm = m.getModifiers();获取方法的修饰符
Class mrt = m.getReturnType();获取返回值数据类型
String mn = m.getName();获取方法的名字
Class[] mp = m.getParameterTypes();获取方法参数列表的类型
Class[] ms = m.getExceptionTypes();获取方法抛出异常的类型
Object = invoke(对象,执行方法需要传递的所有参数);执行方法一次
- Constructor类中的方法
int = getModifiers();获取方法的修饰符
String = getName();获取方法的名字
Class[] cp = c.getParameterTypes();获取方法参数列表的类型
Class[] cs = c.getExceptionTypes();获取方法抛出异常的类型
二、注解
-
注释
Annotation(注释 注解) -
注解
1.注解的写法
- @xxx(一些信息)
2.注解放置的位置
- 类上面 属性上面 方法上面 构造方法上面 参数前面
3.注解的作用
- 用来充当注释的作用(仅仅是一个文字的说明)@Deprecated
- 用来做代码的检测(验证)@Override
- 可以携带一些信息(内容)文件.properties .xml 注解
4.java中已经写好的注解供我们使用
-
@Deprecated 用来说明方法是废弃的
-
@Override 用来做代码检测的,检测此方法是否是一个重写
-
@SuppressWarnings(信息) 是一个String[]类型{“”,“”,“”} 如果数组内的元素只有一个长度,可以省略{}
unused 变脸定义后没被使用
serial 类实现了序列化接口,不添加序列号ID号
rawtypes 集合没有定义泛型
deprecation 方法已废弃
unchecked 出现泛型的问题,可以不检测
all 包含了以上所有(一般不推荐使用)
5.注解中可以携带信息,也可以不携带
- 信息不能随便写,信息的类型只能是如下的类型
1、基本数据类型
2、String类型
3、枚举累心enum
4、注解类型@
5、数组类型[] 数组的内部需要时以上四种类型之一
6.如何描述一个注解类型
- 通过@interface定义一个新的注解类型
- 发现写法与接口非常相似(可以利用接口的特点来记忆注解)
可以描述public static final的属性,比较少见
可以描述public abstract的方法,方法要求返回值必须有,返回值类型是以上5种
- 自己定义的注解拿来使用时需要操作的步骤
光定义不够,需要很多细致的说明(需要java提供好的注解来说明)
元注解(也是注解,不是拿来使用的,是用来说明注解)
@Target 描述当前的这个注解可以放置的位置
@Retenton 描述当前的这个注解存在什么作用域中的
源代码文件--->编译--->字节码文件--->加载---->内存执行
SOURCE CLASS RUNTIME
@Inherited 描述当前这个注解是否能被子类对象继承
@Document 描述这个注解是否能被文档所记录