Java中的注解和反射

注解 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.反射获取类的完整结构

FieldMethodConstructorSuperclassInterfaceAnnotation
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();//获取本类中所有修饰符所修饰构造函数对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值