1. 反射
Java反射机制是在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意方法和属性,从对象出发,通过反射(Class类)可以取得类的完整信息。简单说就是在运行过程中获得类、对象、方法的所有信息
1. 对象获取的方法
- 通过对象获取
obj.getClass()
- 通过完整类路径获取
Class.fromName("com.java.String")
- 通过类名获取
Object.class
String str1 = "abc";
Class stringClass1 = str1.getClass();
Class stringClass2 = Class.forName(String.class.getName());
Class stringClass3 = String.class;
2. 常用API
API | 说明 |
---|---|
getField() | 返回该对象表示的类或接口声明的字段,仅public修饰符 |
getDeclaredField() | 返回该对象表示的类或接口声明的字段,所有属性 |
getMethod() | 返回该对象表示的类或接口声明的方法,仅public方法 |
getDeclaredMethod() | 返回该对象表示的类或接口声明的方法,所有方法 |
getConstructor() | 指定public构造函数 |
getDeclaredConstructor() | 指定私有或共有构造函数 |
getAnnotation() | 获取元素注解 |
Class<Simple> simpleClass = Simple.class;
//生成无参私有构造函数
Constructor<Simple> constructor = simpleClass.getDeclaredConstructor();
constructor.setAccessible(true);
Simple simple = constructor.newInstance();
//获取sth方法
Method sth = simpleClass.getDeclaredMethod("sth");
sth.setAccessible(true);
//执行sth()方法
sth.invoke(simple);
Field name = simpleClass.getDeclaredField("name");
name.setAccessible(true);
//给name属性赋值
name.set(simple, "唐人");
2. 注解
- 元注解
元注解的作用就是负责注解其他注解
@Target
标识这些注解应该是哪种java成员
ElementType.ANNOTATION_TYPE
可以应用于注释类型。
ElementType.CONSTRUCTOR
可以应用于构造函数。
ElementType.FIELD
可以应用于字段或属性。
ElementType.LOCAL_VARIABLE
可以应用于局部变量。
ElementType.METHOD
可以应用于方法级注释。
ElementType.PACKAGE
可以应用于包声明。
ElementType.PARAMETER
可以应用于方法的参数。
ElementType.TYPE
可以应用于类的任何元素
@retention
标识这个注解怎么保存(SOURCE:代码中、CLASS:class文件中、RUNTIME:运行时可通过发射访问)@Decoumented
标识这些注解是否包含在用户文档中@Inherited
标记这个注解是继承与那个注解类
- 内置注解
@Override
检查该方法是否是重载方法@Deprecated
标识过时方法@SuppressWarnings
指示编译器去忽略注解中声明的警告
- Java7后新增的
@SafeVarargs
java7开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告@Functionallnterface
java8开始支持,标识一个匿名函数或函数式接口@Repeatable
java8开始支持,标识某注解可以在同一个声明上使用多次
- 自定义注解
自定义
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FiledParams {
int len() default 1;
ParamType type() default ParamType.HEX;
}
使用注解
class Bean{
@FiledParams(len=10)
public String name;
}
处理
//获取类的所有属性
Field[] declaredFields = objClass.getClass().getDeclaredFields();
for (Field declaredField : declaredFields ){
FiledParams filedParams = declaredField.getAnnotation(FiledParams.class);
if (filedParams != null){
Object value = HexParse.byte2Param(tempData, filedParams.type());
declaredField.set(objClass, value);
}
}
return objClass
3. 注解处理器
注解处理器有两种方式,一种是上面的通过反射定义注解处理器,另外一种就是继承AbstractProcessor
来实现自定义注解处理器