内置注解
@Override 表示一个方法声明打算重写父类中的另一个方法声明
@Deprecated 表示不鼓励程序员使用该元素,通常因为他们很危险或者存在更好的选择
@SuppressWarnings 抑制编译警告
元注解:负责注解其他注解。Java定义了4个标准的meta-annotation。
在包java.lang.annotation中
@Target 描述注解的适用范围
@Retention 描述注解的生命周期 SOURCE<CLASS<RUNTIME
@Documented 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解
反射(Reflection):是Java被视为动态语言的关键。反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
一个类在内存中只有一个Class对象
一个类被加载后,类的整个结构都会被封装在Class对象中
Class类:
- Class类本身也是一个类
- Class对象只能由系统建立对象
- 一个加载的类在JVM中只会有一个Class实例
- 一个Class对象对应的是一个加载到JVM中的一个.class文件
- 每个类的实例都会记得自己由哪个Class实例所生成
- 通过Class可以完整的得到一个类中所有被加载的结构
获得Class类的方式:
package com.example.reflection; public class reflection { public static void main(String[] args) throws ClassNotFoundException { Person person = new Student(); //方式一:通过对象获得 Class c1 = person.getClass(); System.out.println(c1.hashCode()); //方式二:Class.forName获得 Class c2 = Class.forName("com.example.reflection.Student"); System.out.println(c2.hashCode()); //方式三:通过类名.class返回 Class c3 = Student.class; System.out.println(c3.hashCode()); //方式四:基本内置类型的包装类有一个TYPE属性 Class c4 = Integer.TYPE; //获得父类类型 Class c5 = c1.getSuperclass(); System.out.println(c5); } } class Person{ protected String name; } class Student extends Person{ public Student() { this.name = "学生"; } } class Teacher extends Person{ public Teacher() { this.name = "老师"; } }
反射工具使用
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅
使用hutool里反射工具进行赋值和取值
定义一个枚举,枚举的其中一个值是另一个类中的变量名。
package com.example.reflection; import lombok.Getter; @Getter public enum Permission { EAT(0,"eat"), PLAY(1,"play"), SLEEP(2,"sleep"), ; private Integer code; private String msg; Permission(Integer code, String msg) { this.code = code; this.msg = msg; } }
普通实体类:
package com.example.reflection; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Builder @Data @AllArgsConstructor @NoArgsConstructor public class PersonPermission { private Boolean eat; private Boolean play; private Boolean sleep; }
测试类:
import cn.hutool.core.util.ReflectUtil; import com.example.reflection.Permission; import com.example.reflection.PersonPermission; public class TestdemoApplication { public static void main(String[] args) throws NoSuchFieldException { PersonPermission personPermission = PersonPermission.builder() .eat(false) .play(false) .sleep(false) .build(); System.out.println(personPermission); Permission[] values = Permission.values(); for (Permission p:values ) { //通过反射赋值 ReflectUtil.setFieldValue(personPermission,p.getMsg(),true); } System.out.println(personPermission); for (Permission p:values ) { //通过反射取值 Boolean res = (Boolean)ReflectUtil.getFieldValue(personPermission,p.getMsg()); System.out.println(p.getMsg() + " " + res); } } }
输出如下: