注解和反射

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。


待续。。。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务