注释和反射

345 阅读2分钟

注释

注释(java annotation) 格式@+注释名

内置注解

  1. @override 重写的注释
  2. @Deprecated 废弃的
  3. @SuppressWarnings 抑致编译警告

元注解

原注解的作用是负责注解其他注解

  1. @Target 描述用在什么地方 如@Target(value=ElemenType.Mehod,ElemenType.Type)表示注解可以用在方法和类上
  2. @Retention 在什么级别保存该注解信息,用于描述注解的生命周期(source<class<Runtime)大多用runtime运行时 如@Retention(value=Retentionpolicy.Runtime)
  3. @Document 表示是否包含生成在Javadoc中
  4. @inherited 说明子类是否可以继承父类中的注解

自定义注解

使用@interface自定义注解 继承了java.lang.annotation

@Target({ElemenType.Mehod,ElemenType.Type})
@Retention(value=Retentionpolicy.Runtime)
@interface abc{
 String name() default "";
 int id() default -1;//-1代表不存在
 String []school() default("123","124");
 //注解参数:参数类型+参数名();
 String value(); //只有一个值可以引用该注解可不写
}

注解可用反射的方法读取

反射

发射(java.reflection)java是静态的反射使其准动态

获得反射对象

Calss c1=Class.forName("完整类名");

  1. 一个类只有一个类对象
  2. 一个类加载后,类的整个结构都会被封装载类对象中

得到类的方式

  1. 通过forname获得 Calss c1=Class.forName
  2. 通过对象获得class c2=对象.getclass();
  3. 通过类名获得 Calss c3=类名.class
  4. 内置类型包装类都有一个Type属性Calss c4=Integer.TYPE;

类加载与ClassLoad

类加载——>类的链接——>类的初始化

静态变量在链接准备阶段就在方法区中进行分配

类的初始化

  1. 类的主动引用
  2. 类的被动引用,如数组,常量,子类引用父类的静态变量

类加载器

  1. 引导类加载器(rt.jar包中)
  2. 扩展类加载器
  3. 系统类加载器 项目中的类

获取系统类加载器:

ClassLoader systemClassLoader=ClassLoader.getSystenClassLoad();(为Appclassloader)

测试当前类是谁加载的:

ClassLoader classLoader=Class.forName("完整类名").getclassloader();(为Appclassloader)

获取类的运行时结构

  1. 获得类的名字 Calss c1=Class.forName("完整类名"); c1.getName 得到(包名+类名) c1.getSimpleName 得到类名
  2. 获得类的属性 Field[] filds=c1.getFilelds()// 只能得到public属性 c1.getDeclaredFields//找到全部属性
  3. 获得类的方法 c1.getmethods();(获得本类和父类的public方法) c1.getDeclaredMethods();(数组,本类所有方法)

动态创建对象

  1. c1.newInstance();// 调用了类中的无参构造器

  2. 通过构造器创建对象

Constructor constructor=c1.getDeclaredConstructor(String.class,int.class,int.class);
User user1=(User) constructor.newInstance("小王",18,6);
  1. 通过反射调用方法
User user2=(User)c1.newInstance();
Mothod setName=c1.getDeclaredMethod("setName",string.class);
setName.invoke(user2,"小王");

invoke:激活的意思(对象,"方法值")

  1. 反射操作属性
User user3=(User)c1.newInstance();
Field name=c1.getDeclaredField("name");
name.setAccessible(true);//不能直接操作私有属性
name.set(user3,"小王");

反射操作注解

ORM->对象关系映射

Calss c1=Class.forName("完整类名");
//通过反射获得注解
Annotation[] annotations=c1.getAnnotations();
//获得注解value的值
Annotation annotation=c1.getAnnotations("指定注解");
String value=annotation.value();

//获得指定的注解