注释
注释(java annotation) 格式@+注释名
内置注解
- @override 重写的注释
- @Deprecated 废弃的
- @SuppressWarnings 抑致编译警告
元注解
原注解的作用是负责注解其他注解
- @Target 描述用在什么地方 如@Target(value=ElemenType.Mehod,ElemenType.Type)表示注解可以用在方法和类上
- @Retention 在什么级别保存该注解信息,用于描述注解的生命周期(source<class<Runtime)大多用runtime运行时 如@Retention(value=Retentionpolicy.Runtime)
- @Document 表示是否包含生成在Javadoc中
- @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("完整类名");
- 一个类只有一个类对象
- 一个类加载后,类的整个结构都会被封装载类对象中
得到类的方式
- 通过forname获得 Calss c1=Class.forName
- 通过对象获得class c2=对象.getclass();
- 通过类名获得 Calss c3=类名.class
- 内置类型包装类都有一个Type属性Calss c4=Integer.TYPE;
类加载与ClassLoad
类加载——>类的链接——>类的初始化


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

类的初始化
- 类的主动引用
- 类的被动引用,如数组,常量,子类引用父类的静态变量
类加载器
- 引导类加载器(rt.jar包中)
- 扩展类加载器
- 系统类加载器 项目中的类
获取系统类加载器:
ClassLoader systemClassLoader=ClassLoader.getSystenClassLoad();(为Appclassloader)
测试当前类是谁加载的:
ClassLoader classLoader=Class.forName("完整类名").getclassloader();(为Appclassloader)
获取类的运行时结构
- 获得类的名字 Calss c1=Class.forName("完整类名"); c1.getName 得到(包名+类名) c1.getSimpleName 得到类名
- 获得类的属性 Field[] filds=c1.getFilelds()// 只能得到public属性 c1.getDeclaredFields//找到全部属性
- 获得类的方法 c1.getmethods();(获得本类和父类的public方法) c1.getDeclaredMethods();(数组,本类所有方法)
动态创建对象
-
c1.newInstance();// 调用了类中的无参构造器
-
通过构造器创建对象
Constructor constructor=c1.getDeclaredConstructor(String.class,int.class,int.class);
User user1=(User) constructor.newInstance("小王",18,6);
- 通过反射调用方法
User user2=(User)c1.newInstance();
Mothod setName=c1.getDeclaredMethod("setName",string.class);
setName.invoke(user2,"小王");
invoke:激活的意思(对象,"方法值")
- 反射操作属性
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();
//获得指定的注解
