注解 Java.Annotation
Annotation 的作用:
不是程序本身,可以对程序作出解释(这一点和注释(comment)没有区别)。
可以被其他程序(比如:编译器等)读取。
Annotation 的格式:
注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(Value=“unchecked”)
Annotatin 在哪里使用?
可以附加在pachage,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
public class Test02 {
// 注解可以显示赋值,如果没有赋值,我们就必须给注解赋值
@MyAnnotation(age = 18)
public void test(){
}
}
//定义一个注解
// Target 表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})
// Retention 表示我们的注解在什么地方还有效
// runtime>class>sources
@Retention(value = RetentionPolicy.RUNTIME)
// Documented表示是否将我们的注解生成在JAVAdoc中
@Documented
// Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation{
//注解的参数: 参数类型 + 参数名();
String name() default "";
int age() default 12;
int id() default -1; //如果默认值是-1,代表不存在
String[] schools() default {"北京大学","清华大学"};
}
自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
分析:
- @interface用来声明一个注解,格式: public @interface 注解名{定义内容}
- 其中的每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值类型就是参数类型(返回值只能是基本类型,class,String,enum)
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
反射 Java.Reflection
Java Reflection
Java 反射的优点和缺点
优点:可以实现动态创建对象和编译,体现出很大的灵活性。
缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。
// 反射相关的主要API
java.lang.Class : 代表一个类
java.lang.reflect.Method : 代表类的方法
java.lang.reflect.Field : 代表类的成员变量
java.lang.reflect.Constructor : 代表类的构造器
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
// 通过反射获取类的class对象
// 一个类在内存中只有一个class对象,一个类被加载后,类的整个结构都会被封装在class对象中
Class c1 = Class.forName("reflection.User");
System.out.println(c1); // class reflection.User
}
}
只要元素类型与维度一样,就是同一个class。