Annotation 注解
作用:不是程序本身,只是对程序作出解释。
可以被其他程序读取。
元注解:
@Target:用于描述注解的使用范围
包、类、接口、枚举、类成员、方法参数、本地变量
@Retention:表示需要在什么级别保存该注册信息,用于描述注解的生命周期
SOURCE(源文件)、CLASS、RUNTIME(运行、反射)
/*获取类所有有效注解*/
Annotation[] annotations = aClass.getAnnotations();
/*获取类的指定注解*/
SxtDemo03 sd = (SxtDemo03) aClass.getAnnotation(SxtDemo03.class);
/*获取类的属性注解*/
Field f = aClass.getDeclaredField("name");
SxtFiled sxtFiled = f.getAnnotation(SxtFiled.class);
Reflection 反射机制:
指的是可以再运行时加载、探知、使用编译期间完全未知的类。程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已经加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
Class c = Class.forName("com.it.test.User");
c.getName()//获取包名加类名
c.getSimpleName();//获取类名:User
//获取属性
//Field[] fields = c.getFields();//只能获取public的filed
Field[] fields = c.getDeclaredFields();//获取所有属性
Field field = c.getDeclaredField("id");
/*获取方法*/
//Method method = c.getMethod();//只能获取公开方法
Method[] method = c.getDeclaredMethods();//获取所有方法
Method m = c.getDeclaredMethod("getId",null);
//如果有参,则必须传递参数类型对应的Class对象
Method m1 = c.getDeclaredMethod("setName", String.class);
/获取构造器信息
Constructor[] constructor = c.getDeclaredConstructors();
Constructor constructor1 = c.getDeclaredConstructor(int.class,int.class,String.class);
//通过反射API调用无参构造
User user = c.newInstance();
//有参构造
Constructor<User> constructor = c.getDeclaredConstructor(int.class,int.class,String.class);
User user1 = constructor.newInstance(1001,18,"张三");
//通过反射API调用普通方法
User user2 = c.newInstance();
Method method = c.getDeclaredMethod("setName", String.class);
method.invoke(user2,"权毅超");
System.out.println(user2.getName());
/*通过反射API操作属性*/
User user3 = c.newInstance();
Field f = c.getDeclaredField("name");
f.setAccessible(true);//这个属性不需要再做安全检查,可直接访问
f.set(user3,"高静");
System.out.println(user3.getName());
System.out.println(f.get(user3));
- 加载完类之后,在堆内存中,就会产生一个Class类型的对象(类对象),这个对象就包含了完整的类信息的结构信息。我们可以通过这个对象看到类的结构,这个对象好比一面镜子,透过镜子可以看到了类的结构,所以,将之称之为:发射。
反射机制性能:
setAccessible(true);//这个属性不需要再做安全检查,可直接访问,在需要考虑运行效率时可直接使用。
反射操作泛型:
Java采用泛型擦除的机制来引入泛型,其仅仅在编译时使用,确保数据的安全性和免去强制类型转换的麻烦,但一旦编译完成,所有与泛型有关的类型全部擦除。
Java通过增加ParameterizedType、GenericArrayType、TypeVariabie和WildcardType几种类型来代表不能被归一到Class类中的类型但又和类型齐名的类型。