注解和反射

2、元注解

  • 元注解负责注解其他注解,java定义了4个标准的meta-annotation类型,被用来提供对其他annotation类型作说明、
  • @Target 描述注解的使用范围,可传递一个数组
  • @Rentention 描述注解的有效范围
  • @Documented 表示是否将注解生产在javadoc文件中
  • @Inherited 表示子类可以继承父类的注解

3、 自定义注解

@interface

// 注解的参数:参数类型+参数名()

public class TestAnnotations {

    @Myannotation(age=19)
    public void test(){}

}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotation{
    // 注解参数:类型+参数名()
    String name();
    int age();
    // 默认值
    String name()default "";
}

3、反射机制

  • 加载完类之后,在堆内存的方法区产生一个Class类型的对象一个类只有一个Class对象),这个对象包含了完整的类的结构信息。通过这个对象看到类的结构。
// 正常方式
引入需要的”包类“名称—— new实例化——取得实例化对象
// 反射
实例化对象——getClass()方法——得到完整的”包类“名称

`一个类在内存中只有一个Class对象`
public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {
        // 通过反射获得Class对象
       Class c1 = Class.forName("demo.User");
        Class c2 = Class.forName("demo.User");
       System.out.println(c1);
       // hashCode相等
       // 一个类只有一个Class对象
       // 一个类被加载后,类的整个结构都封装在Class对象中
       System.out.println(c1.hashCode());
       System.out.println(c2.hashCode());
    }
}
class User{
    int age;
    int sex;
    String name;
}

3、获得Class方式

public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {
        User user =new User();
        System.out.println(user.name);

        // 方式一:通过对象获得
        Class c1=user.getClass();
        System.out.println(c1.hashCode());

        //方式2:Class.forName()
        Class c2 = Class.forName("demo.User");
        System.out.println(c2.hashCode());

        // 方式3:通过类名.class获得
        Class c3 = User.class;
        System.out.println(c3.hashCode());

        // 方式4:内置基本数据类型的包装类都有一个TYPE属性
        Class c4 = Integer.TYPE;
        System.out.println(c4.hashCode());

        // 获得父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);

    }
}

4、哪些类型有Class对象?

  1. Class:外部类、成员、局部内部类、匿名内部类
  2. [ ]数组
  3. enum
  4. annotation :注解@interface
  5. primitive type:基本数据类型
  6. void

5、java内存分析

java内存区域分析

后进先出

  • 存放基本变量类型(包含具体值)
  • 引用对象的变量(存放这个引用在堆里的具体地址)

不连续的空间、new

  • 存放new的对象和数组(类的实例)
  • 可以被所有线程共享,不会存在其他的对象引用

方法区

在堆空间内,用于存放代码、静态变量和方法、常量池

  • 可以被所有线程共享
  • 包含多有的class和static变量

注解和反射_第1张图片

Student stu = new Student();

注解和反射_第2张图片

你可能感兴趣的:(java基础,java,开发语言)