注解和反射
Annotation
作用
- 不是程序本身,可对程序作出解释
- 可以被其他程序读取
格式
@注解名
,可以添加一些参数值
可以附加在package,class,method,field等上面,相当于添加额外的辅助信息,通过反射机制编程可实现对这些元数据的访问。
内置注解
元注解
负责注解其他注解,Java定义了4个标准的meta-annotation类型,这些类型和它们所支持的类在java.lang.annotation包中可以找到(@Target, @Retention, @Documented, @Inherited)
自定义注解
package com.kuang.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.SOURCE; public class Test03 { //注解可以显式赋值,若无默认值则必须赋值 @MyAnnotation2(age=18) public void test(){} } @Target(value=METHOD) @Retention(RetentionPolicy.SOURCE) @interface MyAnnotation2 { //注解的参数:参数类型+参数名() //若只有一个值,默认是String value(); //若只有一个值,@那里可以省略value=,直接给出值 String name() default ""; int age(); int ID() default -1;//默认值-1代表不存在 }
Reflection
作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员变量和方法
- 在运行时处理注解
- 生成动态代理
优缺点
优点
可以实现动态创建对象和编译,体现出很大的灵活性
缺点
降低性能。反射一般是解释操作,慢于直接执行相同的操作
Class类
package com.kuang.reflection; //获取Class类的方式 public class Test02 { public static void main(String[] args) throws ClassNotFoundException { Person p = new Student(); System.out.println("这个人是"+p.name); //方式一:通过对象获得 Class c1 = p.getClass(); System.out.println(c1.hashCode()); //方拾贰:forName获得 Class c2 = Class.forName("com.kuang.reflection.Student"); System.out.println(c2.hashCode()); //方式三:通过类名.class获得 Class c3 = Student.class; System.out.println(c3.hashCode()); //方式四:基本内置类型的包装类都有一个Type属性 Class c4 = Integer.TYPE; System.out.println(c4); //方式5:获得父类类型 Class c5 = c1.getSuperclass(); System.out.println(c5); System.out.println(c5.hashCode()); } } 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 = "xuesheng"; } } class Teacher extends Person{ public Teacher() { this.name = "xuesheng"; } }
可以有Class对象的类型
只要元素类型与维度一样,就是同一个Class。
待续。。。