Java基础篇——注解和反射
注解
注解Annotation可以被其他程序(编译器)读取,常见的有@override
内置注解
-
@Override
适用于修饰方法,表明重写父类中的一个方法
-
@Deprecated
用于修饰类、方法、属性等,表示由于落后或者存在危险被舍弃,不鼓励使用
-
@SuppressWarnings("")
用于镇压编译器的警告,可以有很多参数选择“all”"unchecked""value={"unchecked","deprecation"}"
元注解
用于解释其他注解的注解
-
@Target()
@Target(value=ElementType.METHOD)//表明该注解只能用于方法带参,用于描述注解的使用范围
-
@Retention
描述注解的生命周期
(SOURCE、CLASS、RUNTIME)
-
@Documented
表示是否将注解生成在JAVAdoc中
-
@Inherited
表示子类可以继承父类的注解
自定义注解
-
使用@interface定义
public @interface 注解名 { //参数定义方法:参数类型+参数名(); int age() default 0;//默认值为0 } //代码块中的方法即是注解的参数 //可以通过default来声明参数的默认值 //注解元素必须要有值
反射
反射Reflection的出现使Java成为了准动态语言,利用反射机制,可以使原本静态的Java语言获得类似动态语言的特性,取得任何类的内部信息,包括private修饰的属性
-
获取反射对象
Class 对象名 = 类的class属性; Class 对象名 = Class.forName("类路径"); Class 对象名 = 类实例对象.getClass(); -
有Class对象的类型
[所有的类、接口、数组、枚举、注解、基本数据类型、void]
-
不会引发类初始化的情况
- 子类引用父类静态变量
- 通过数组定义引用类
- 引用类的常量属性
-
类的加载机制
-
-
获取类的运行时结构
ReflectionTest test = new ReflectionTest();//创建类实例 //反射获取类对象 //Class myclass =Class.forName("practice11.ReflectionTest"); Class myclass =test.getClass(); //获取类名 System.out.println(myclass.getName()); System.out.println(myclass.getSimpleName()); //获取属性 Field[] fields1 = myclass.getFields();//获取public属性 Field[] fields2 = myclass.getDeclaredFields();//获取所有属性 //获取方法 Method[] methods1 = myclass.getMethods();//获取该类及其父类的所有public方法 Method[] methods2 = myclass.getDeclaredMethods();//获取本类的所有方法 -
动态创建对象
Class myRft = Class.forName("practice11.ReflectionTest"); //使用反射对象的newInstance方法实例化对象/ ReflectionTest test1 =(ReflectionTest) myRft.newInstance();//调用无参构造 System.out.println(test1.toString()); //使用构造器实例化对象 Constructor constructor = myRft.getConstructor(String.class, int.class); ReflectionTest test2 =(ReflectionTest) constructor.newInstance("祖国万岁",72);//调用有参构造 //通过反射调用方法 Method name = myRft.getDeclaredMethod("setName", String.class);//获取方法 name.invoke(test2,"中国万岁");//调用方法 //通过反射修改属性 Field age = myRft.getDeclaredField("age"); age.setAccessible(true);//关闭权限检测(可以修改私有属性) age.set(test2,70); -
通过反射获得注解
//获得类层的所有注解 Annotation[] annotations = Student.class.getAnnotations(); //获得属性的注解 Field[] fields = Student.class.getFields(); for (Field field : fields) { MyField fieldAnnotations = field.getAnnotation(MyField.class); System.out.println(fieldAnnotations); }

浙公网安备 33010602011771号