常见的注解原理有三类分别是:@Override(重写方法,例如线程中当继承了Runnable接口的时候我们需要重写Run方法就会看到这样的符号) @Deprecated(存在危险或者已经废除的方法,不推荐程序员使用的方法,但是方法依旧存在,也可以运行) @SuppressWarnings(警告,例如说一些没有用到的常量符号,可以通过这样的注解去除)
元注解的方式
1、@Target({ElementType.Type/Method})
2、@Retention (Runtime(最常用的)>CLASS>sources) 以上两个是最常用的
package TestSleep;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class TestAnno {
@myAnnotation(name = "cak")
public void method(){
}
@myAnnotation1(v = "cak")
public void method1(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
String name();
int id() default -1;//可以加一个默认值
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation1{
//不成文规定 value可以省略名字,但是新版本不加会报错
String value();
}
3、@Decomented 是否将注释生成到文本当中
4、@Inherited 是否继承父类的方法
此外只有一个参数时候推荐使用value()函数命名,然后注解里面的参数定义为类型+参数名字()
反射(java.Reflection):
优点是动态创建具有灵活性,缺点是对性能有影响,不宜全部使用
创建类(class)对象,这里要说名一个类只有一个对象和其创建方式没有关系,可以用.hashcode()方法对类对象进行观测。
创建对象的方法:class c1 = person.getClass()
class c2 = class.forName("包名+类名")
class c3 = person.class
虽然以上三种方式都是创建Class对象但是对象都是一样的,此外对于Static代码块和定义,就是谁在前谁先运行。