本文整理自狂神视频【狂神说Java】注解和反射
注解
内置注解
@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 c2 = Class.forName("com.example.reflection.Student");
System.out.println(c2.hashCode());
Class c3 = Student.class;
System.out.println(c3.hashCode());
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
使用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);
}
}
}
输出如下:
|