首页 > 编程语言 >Java注解和反射

Java注解和反射

时间:2024-05-01 20:00:40浏览次数:32  
标签:反射 Java name Class Person 注解 public String

  1. 元注解:负责注解其他的注解,Java定义了4个标准的meta-annotation类型
    @Target:用于描述注解的适用范围
    @Retention:表示需要再什么级别保存该注解信息,用于描述注解的生命周期(source<class<runtime)
    @Document:该注解江北包含在javadoc中
    @Inherited:说明子类可以继承父类中的注解
  2. 自定义注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface MyAnnotation {
        //类型 参数名() 默认值
       String value() default "";
    }
    
  3. 动态语言:就是在运行代码时可以根据某些条件改变自身结构
    静态语言:运行是结构不可变,如java,c++
    但java有一定的动态性,可以利用反射机制获得类似动态语言的特性,使编程更加灵活
  4. 获取Class对象的三种方式
    //一个Person类
    public class Person {
    private String name;
    private int age;
    
    public Person() {
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
      }
    }
    //通过三种方式获得Class对象
    import domain.Person;
    public class ReflectDemo {
        public static void main(String[] args) throws ClassNotFoundException {
            //1.Class.forName("全类名")
            Class cls0 = Class.forName("domain.Person");
            System.out.println(cls0);
    
            //2.类名.class
            Class cls1 = Person.class;
            System.out.println(cls1);
    
            //3.对象.getClass()
            Person p = new Person();
            Class cls2 = p.getClass();
            System.out.println(cls2);
        }
    }
    
  5. class,interface,[],enum,annotation,primitive type,void都有Class对象
  6. 类加载分为三个部分:加载,连接,初始化
    加载:将.class文件的二进制字节流读入内存,并在堆内存中为之创建Class对象,作为.class进入内存后的数据的访问入口。
    为何取消方法区?
    方法区存储类的元数据信息,我们不清楚一个程序到底有多少类需要被加载,且方法区位于JVM内存,我们不清楚需要给方法区分配多大内存,太小容易PermGen OOM,太大,在触发Full GC时又极其影响性能,同时还存在一些内存泄露的问题
    连接:分为三个阶段,验证,准备,解析
    验证:为了保证加载进来的字节流符合JVM的规范,不会对JVM有安全性问题。
    准备:准备阶段的主要任务是为类的类变量开辟空间并赋默认值。
    解析:该阶段的主要职责为将Class在常量池中的符号引用转变为直接引用,此处针对的是静态方法及属性和私有方法与属性。
    初始化:该阶段主要是为类的类变量初始化值的,在声明类变量时,直接给变量赋值或者在静态初始化块为类变量赋值
  7. 反射的作用:动态创建对象,动态操作属性,动态调用方法
  8. Class类的常用方法:
    getFields()—— 获得类的public类型的属性;getDeclaredFields()—— 获得类的所有属性;getField(String name)—— 获得类的指定属性;
    getMethods()—— 获得类的public类型的方法;getMethod (String name,Class [] args)—— 获得类的指定方法;
    getConstrutors()—— 获得类的public类型的构造方法;getConstrutor(Class[] args)—— 获得类的特定构造方法;
    newInstance()—— 通过类的无参构造方法创建对象;
    getName()—— 获得类的完整名字;
    getPackage()—— 获取此类所属的包;
    getSuperclass()—— 获得此类的父类对应的Class对象
    

标签:反射,Java,name,Class,Person,注解,public,String
From: https://www.cnblogs.com/hytip/p/18169591

相关文章

  • Spring注解开发
    配置bean在类的上方一个注解:@Component,就表示配置了该类@Component("该类的名称,可以省略不写")publicclassDaoImplimplementsDao{ publicvoidshow(){ }}在xml配置文件中,添加扫描注解的配置#base-package表示要扫描的包<context:component-scanbase-package="......
  • day29-JavaScript(1)
    1、JavaScript的历史1.1、JavaScript的历史JavaScript因为互联网而生,紧随着浏览器的出现而问世。回顾它的历史,就要从浏览器的历史讲起。1990年底,欧洲核能研究组织(CERN)科学家TimBerners-Lee,在全世界最大的电脑网络——互联网的基础上,发明了万维网(WorldWideWeb),从此可以在网......
  • 04.Java 流程控制
    1.用户交互ScannerScanner对象:获取用户的输入基本语法:Scanners=newScanner(System.in);通过Scanner类的next()和nextLine()方法获取输入的字符串,在读取前一般使用hasNext()和hasNextLine()判断是否还有输入的数据。next():一定要读取到有效字符后才可以结束......
  • Java多线程
    程序,进程,线程程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念;进程是执行程序的一次执行过程,是一个动态的概念,是系统资源分配的单位;通常在一个进程中可以包含若干个线程,线程是CPU调度和执行的单位;若是单核cpu,则多线程是模拟出来的,在一个cpu的情况下,在同......
  • Java IO流之为什么要手动关闭IO流
    目录1IO流关闭1.1问题引入1.2为什么IO流需要手动关闭1.3正确关闭流姿势介绍1.3.1在try中关流而没在finally中关流1.3.2在关闭多个流时将其放在一个try中1.3.3在循环中创建流在循环外关闭1.3.4关闭多个流时没用遵循后定义先释放原则1.3.5jdk7及以上版本推荐try-......
  • 03.Java 基础语法
    1.注释、标识符、关键字三种注释单行注释://多行注释:/*多行注释*/文档注释:/***@DescriptionHelloWorld*@Authorxxx*/标识符关键字Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符2.数据类型强类型语言:要求变量的使用严格符合规定,......
  • java EasyExcel 导出不同dto到多sheet,同时有动态字段,分页写入方案,解决存在oom的问题
    思路 1将一次查询数据改成分页查询,比如一次2000条,2将每次查询的数据按业务分组计算每类业务动态列追加的最大次数treeMap追加列2在excel列表头则是追加2列,名称自定义,我这边是补数字,示例追加列1,追加列2我的业务是按数据库存放的图片来确定最大追加列,需要将图片......
  • Java实现自定义指标数据远程写入Prometheus
    主要的流程如下:1>prometheus添加启动参数2>调用http请求来远程写,数据格式是protobuf(一种自定义的编码格式),编码格式是snappy(一种压缩格式)3>远程写通过snappy先压缩,然后将通过protobuf编码的字节数组发送请求;prometheus官网文档远程写提供remote.proto(包含编码和解码),remote.pr......
  • JavaScript函数
    JavaScript函数函数就是一些功能或语句的封装。在需要的时候,通过调用的形式,执行这些语句。函数也是一个对象函数定义我们使用function关键字定义函数,中文含义是“函数”、“功能”。可以使用如下方式进行定义。函数声明使用函数声明来创建一个函数。语法:function函数名([形......
  • java5
    for循环:publicclassFor{publicstaticvoidmain(String[]args){intsum=0;for(inti=1;i<=100;i++){if(i%2==0){sum=sum+i;}}System.out.println(sum);}while循环:......