java 注解和反射

8.注解和反射
8.1 什么是注解annotation jkd5.0提供的
8.2 内置注解:
@override 覆盖方法
@Deprecated不推荐使用,
@suppressWarnings抑制警告信息:
8.3 元注解:解释其他注解的注解meta-annotation
@Target 描述注解范围
@Retention 注解生命周期:source<class<runtime
@Documented:注解被包含在javadoc中
@Inherited 说明子类可以继承父类中的注解

 /**
 *     @Target 描述注解范围
 *     @Retention 注解生命周期:source<class<runtime
 *    @Documented:注解被包含在javadoc中
 *    @Inherited 说明子类可以继承父类中的注解
 * */
@Retention(value= RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
@Documented
@Inherited
@interface MyAnnotation{
    //注解的参数:参数类型+参数名()
    String name() default "";
    int age();
    String[] schools() default {"beida","qinghua"};
}

@MyAnnotation(age=10,name = "zhangsan",schools = {"wuda"})
public void test(){

}

8.4 自定义注解:使用@interface声明自定义注解
@interface MyAnnotation{
//注解的参数:参数类型+参数名()
String name() default "";
int age();
String[] schools() default {"beida","qinghua"};
}

8.5 反射:Reflection 程序在运行期通过reflection api获取任何类的内部信息
反射机制:动态语言:在运行时可以改变其结构的语言,静态语言,
获取class实例:一个类一个class对象
类加载与classLoader
创建运行时类的对象
获取运行时类的完整结构
调用类的指定结构对象
8.6 获得反射对象:一个类一个class对象
Person ps=new Person();

    Class c1= ps.getClass();
    Class c2=Person.class;

    System.out.println(c1.hashCode());
    System.out.println(c2.hashCode());

    Class c3= Object.class;
    Class c4= Comparable.class;
    Class c5= String[].class;
    Class c6= int[].class;
    Class c7= ElementType.class;
    Class c8= Integer.class;
    Class c9= void.class;
    Class c10= Class.class;

    System.out.println(c3);
    System.out.println(c4);
    System.out.println(c5);
    System.out.println(c6);
    System.out.println(c7);
    System.out.println(c8);
    System.out.println(c9);
    System.out.println(c10);

8.7 得到class类的几种方式
java.lang.class
java.lang.reflect.Method
java.lang.reflect.Field
java.lang.reflect.Constructor
8.8.类的加载:类的加载--》连接--》初始化
8.9 类的加载内存分析
8.10 分析类初始化
8.11获取类的运行时结构:获取方法,属性,构造器
c1.getName();
c1.getSimpleName();
c1.getFields(); //get 本类及父类的全部public
c1.getDeclaredFields() //get 本类全部的属性
c1.getDeclaredMethods();
c1.getDeclaredConstructors()
8.12 动态创建对象执行方法
Constructor con=c1.getDeclaredConstructor();
User user= (User)con.newInstance();
Field name=c1.getDeclaredField("name");
name.setAccessible(true) 启用/禁用安全检查开关
8.13 性能对比分析
反射会 降低性能
long starttime=System.currentTimeMillis();

long endtime=System.currentTimeMillis();

endtime - starttime
9毫秒,6秒,2秒
8.14 获取泛型
public void test01(Map<String,User> map, List list){
System.out.println("test01");
}
8.15.获取自定义注解的值
Class c1=Class.forName("com.kuang.reflection.Student2");
TableField labe=c1.getAnnotation(TableField.class);
String value=labe.value();
System.out.printIn(value);

//获取类指定的注解值
Field f=c1.getDeclaredField("name");
Fieldkuang an=f.getAnnoteation(Fieldkuang.class);
System.out.printIn(an.columnName());
System.out.printIn(an.type());
System.out.printIn(an.length());

posted @ 2024-05-30 15:55  大树2  阅读(7)  评论(0编辑  收藏  举报