注解与反射
学习:菜鸟教程
注解(Annotation)
内置的注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
元注解
**作用在其他注解的注解 **
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
自定义注解(@interface)
使用 @interface 自定义注解时﹐自动继承了java.lang.annotation.Annotation接口
- interface用来声明一个注解﹐格式:public @interface注解名{定义内容}
- 其中的每一个方法实际上是声明了一个配置参数.
- 方法的名称就是参数的名称.
- 返回值类型就是参数的类型(返回值只能是基本类型,Class , String , enum )
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值﹐我们定义注解元素时,经常使用空字符串,0作为默认值.
展示:
1 |
|
反射
获取Class的三方式
| 方式 | 备注 |
|---|---|
| Class.forName(“完整类名带包名”) | 静态方法 |
| 对象.getClass() | |
| 任何类型.class |
通过反射实例化对象
newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。
c1.newInstance();
Class类方法
| 方法名 | 备注 |
|---|---|
| T newInstance() | 创建对象 |
| String getName() | 返回完整类名带包名 |
| String getSimpleName() | 返回类名 |
| Field[] getDeclaredFields() | 返回类中所有的属性 |
| Field getDeclaredField(String name) | 根据属性名name获取指定的属性 |
Field类方法
| void set(Object obj, Object value) | 设置属性值 |
|---|---|
| Object get(Object obj) | 读取属性值 |
set()不可以直接访问私有属性,需要打破封装,才可以
1 | field1.setAccessible(true); //默认false,设置为true为打破封装,set()可以访问私有属性 |
1 | Class c1 = Class.forName("reflection.Person"); |
注解与反射
获取类注解实例
1 c1.getAnnotations()获取属性注解实例
1
2
3
4 //获取属性
Field f1 = c1.getDeclaredField("name");
//获取属性注解实例(多)
Annotation[] a2 = f1.getAnnotations();
1 | Person person=new Person(); |
利用注解与反射自定义一个Frame
注解
1 |
|
测试
1 | public class A_R { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 沐语`Blog!
评论



