注解 Annotation
1.元注解
用于对其他注解进行解释,Java定义了4个标准的meta-annotation
- @Target: 用于描述注解使用的范围
- @Retention 用于表示在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
- @Documented 说明该注解被包含在javadoc中
- @Inherited 说明子类可以继承父类中的该注解
2.注解的参数
注解中只有一个参数时建议取名为value,给注解的参数赋值时value可以省略
若注解中有参数,添加注解时必须给参数赋值,除非注解有默认值(通常是空字符串和0)
注解参数定义为:String value( ) default “ ” 参数类型只能是基本类型、Class,String、enum
反射机制 Reflection
反射机制允许Java在执行期间借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
加载完类之后,会在堆内存的方法区产生一个Class对象(一个类只有一个Class对象,比如int[] a = new int[10],int[] b = new int[20],a.getClass()和b.getclass()得到的Class对象是同一个对象),这个对象包含完整的类内部结构信息,我们可以通过这个对象看到类的结构。
1.Class类常用方法
方法名 | 描述 |
---|---|
static ClassforName(String name) | 返回指定类名name的Class对象 |
Object newInsatance() | 调用缺省构造函数,返回Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类,接口,数组类或void)的名称 |
Class getSuperClass() | 返回当前Class对象的父类 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Constructor[] getConstructors() | 返回一个包含某些Constructor对象的数组 |
Method getMethod(String name,Class…T) | 返回一个Method对象,此对象的形参类型为 paramType |
Field[] getDeclaredFields() | 返回Field对象的一个数组 |
newInstance | 创建该类的一个对象 |
2.哪些类型有Class对象
-
class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
-
interface:接口
-
enum:枚举
-
annotation:注解@interface
-
primitive type:基本数据类型
-
void
3.反射获取类的完整结构
Field | Method | Constructor | Superclass | Interface | Annotation |
---|
User user = new User();
Class userClass = user.getClass();
Method[] methods1 = userClass.getMethods();// 获取本类及父类的public修饰的所有方法
Method[] declaredMethods = userClass.getDeclaredMethods();//获取本类的所有方法不包括继承父类
Method setName = userClass.getDeclaredMethod("setName", String.class);
setName.invoke(user, "chang"); //可以使用invok来调用此方法 传入对象和方法参数
Field[] publicFields = userClass.getFields();// 获取本类及父类public修饰的字段
Field[] declaredFields = userClass.getDeclaredFields();//获取本类所有字段,不包括继承的字段
Field publicField = userClass.getField("publicField");
Field specifyField = userClass.getDeclaredField("name"); //获取指定的private字段
publicField.set(Object obj,newValue)//通过字段对象的set方法,传入该类的某一个实现对象和修改值进行修改
publicField.setAccessible(true) //若字段使用private修饰可以使用setAccessible(true)
Constructor[] constructors = userClass.getConstructors();//获取本类中所有public修饰的构造函数对象
Constructor[] declaredConstructors = userClass.getDeclaredConstructors();//获取本类中所有修饰符所修饰构造函数对象