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
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());