注解
格式:@注释名
1.内置注解
1.@Override:重写
2.@Deprecated:不建议使用
3.@SuppressWarnings(参数):镇压警告
2.元注解
负责注解其他注解。
1.@Target:用于描述注解的适用范围
2.@Retention:表示需要在什么级别保存该注解信息,用于描述注解的生命周期。SOURCE<CLASS<RUNTIME
3.@Document:该注解将被包含在javadoc中
4.@Inherited:子类可以继承父类中的该注解
制作一个自己的注解:
public class Test{
@MyAnnotation
public void test(){
}
}
//对方法的注解
@Target(value=ElementType.METHOD)
//注解在何时有效
@Retention(value=RetentionPolicy.RUNTIME)
@interface MyAnnotation{
}
自定义注解:
package com;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Test {
@MyAnnotation()
//@MyAnnotation(name="参数",age=18)
public void test(){
}
@MyAnnotation2("注解")
public void test2(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//注解参数:参数类型+参数名();
//default "" 默认为空
String name() default "";
int id() default -1;//默认值-1,代表不存在
String[] school() default {"学校"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//如果只有一个参数,建议使用value命名
String value();
}
可以通过反射机制变成实现对注解的读取。
反射Reflection
动态语言:在运行时可以改变其结构的语言。
一个类在内存中中只有一个class对象。被加载后,类的整个结构都会被封装在Class对象中。
class类的创建方法
package com;
//测试class类的创建方式
public class Test3 {
public static void main(String[] args) throws Exception {
Person person=new Student();
System.out.println("这个人是"+person.name);
//方式一:通过对象获得
Class c1 = person.getClass();
//方式二:forName获得
Class c2 = Class.forName("com.Student");
//方式三:通过类名.class获得
Class c3=Student.class;
//方式四:基本内置类型的包装类都有一个TYPE属性
Class c4=Integer.TYPE;
System.out.println(c4);
System.out.println(c1.hashCode()+"+"+c2.hashCode()+"+"+c3.hashCode());
//获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
public String name;
public Person(){
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person{
public Student(){
this.name="学生";
}
}
class Teacher extends Person{
public Teacher(){
this.name="老师";
}
}
可以有Class对象的类型
- class:外部类,成员,局部内部类,匿名内部类
- interface:接口
- []:数组
- enum:枚举
- annotation:注解
- primitive type:基本数据类型
- void
类的加载
- 加载
- 链接
- 初始化
类的初始化
- 类的主动引用:一定会发生类的初始化
- 类的被动引用:不会发生类的初始化
类加载器
- 引导类加载器:核心库
- 扩展类加载器
- 系统类加载器
双亲委派机制
获得类的信息
getFields()获得public属性
getDeclaredFields()获得全部属性
getField(“name”) 获得指定属性
getMethod()获取本类及父类的方法
getDeclaredMethod()获取本类的所有方法
getMethod(“getName”,null)获取指定方法,输入形参以防重载
setAccessible()启动或禁用访问安全检查的开关