注解Annotation
注解入门
作用:可以被其他程序读取,有检查程序的作用
格式:@注释名
适用范围:可以在package,class等上加
内置注解
-
@Override :重写的注解
-
@Deprecated:用于修饰方法,表示不鼓励程序猿使用这样的元素
-
@SuppressWarnings:正压警告,可以把警告消除
自定义注解,元注解
作用:负责注解其他注解
定义了4个标准的meta-annotation
-
@Target:用于描述注解的使用范围
-
@Retention:表示在什么级别保存该注释信息,用于描述注解的生命周期
-
@Documented:表示是否将我们的注解生成在javadoc中
-
@Interited:子类可以继承父类的注解
用@interface自定义注解
public class Test01 extends Object{
//注解可以显示赋值,如果没有默认值。我们必须给注解赋值
@MyAnnotation(name = "dxy")
public void test(){}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//注解的参数:参数类型 参数名()
String name() default "";
int age() default 0;
int id() default -1;//默认值为-1,代表不存在
}
}
反射机制Reflection
动态语言与静态语言
动态语言
在一类在运行时会改变其结构的语言
例如:C#,PHP,Python
静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言
例如:java,C,C++
概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Class c = Class.foeName("java.lang.String")
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException{
//通过反射获取类的class对象
Class c1 = Class.forName("com.dary.annotation.User");
System.out.println(c1);
Class c2 = Class.forName("com.dary.annotation.User");
Class c3 = Class.forName("com.dary.annotation.User");
Class c4 = Class.forName("com.dary.annotation.User");
//一个类在内存中只有一个class对象
//一个类被加载后,类的整个结构都会封装在class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
//注解可以显示赋值,如果没有默认值。我们必须给注解赋值
}
class User{
private String name;
private int id;
private int age;
public User() {
}
public User(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}';
}
}
通过反射获取类类型方式
1.对象.getClass();
2.Class.forName(类全限定名)
3.类名.class