zoukankan      html  css  js  c++  java
  • Java注解与反射

    1.注解annotation:可以被编译器读取

    2.从Java1.5开始引入。

    3。Java内置注解:

    • @Deprecated 已过期,表示方法是不被建议使用的
    • @Override 重写,标识覆盖它的父类的方法
    • @SuppressWarnings 压制警告,抑制警告(需要加参数)

    4.Java除了内置了三种标准注解,还有四种元注解。

    @Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:

         ElemenetType.CONSTRUCTOR-----------------------------构造器声明 
         ElemenetType.FIELD ----------------------------------域声明(包括 enum 实例) 
         ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明 
         ElemenetType.METHOD ---------------------------------方法声明 
         ElemenetType.PACKAGE --------------------------------包声明 
         ElemenetType.PARAMETER ------------------------------参数声明 
         ElemenetType.TYPE----------------------------------- 类,接口(包括注解类型)或enum声明 


    @Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:

         RetentionPolicy.SOURCE-------------注解将被编译器丢弃 
         RetentionPolicy.CLASS -------------注解在class文件中可用,但会被VM丢弃 
         RetentionPolicy.RUNTIME ---------VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。


    @Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。

    @Inherited 允许子类继承父类中的注解。

    5.元注解实例

     6.自定义注解  以及注解参数

    7.

    • 动态语言(弱类型语言)是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。比如Php、Asp、JavaScript、Python、Perl等等。
    var s ="hello";
    var i = 0;
    var b = true;
    • 静态语言(强类型语言)是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须生命数据类型。比如Java、C、C++、C#等。

    8。Java也有var为什么Java还是强类型语言呢?

    var不是关键字,它相当于是一种动态类型;
    var动态类型是编译器根据变量所赋的值来推断类型;
    var 没有改变Java的本质,var只是一种简便的写法,
    就是说在定义局部变量时,任意什么类型都可以用var定义变量的类型会根据所赋的值来判断。

    9。用var声明变量的注意事项:
    1,var只能在方法内定义变量,不允许定义类的成员变量。
    2,var 定义变量必须赋初始值,------》以后不能在赋初始值。
    3,var每次只能定义一个变量,不能复合声明变量。

    10.反射:在jvm加载完类之后,会为每一个类生成一个class对象,这个class对象包含了完整的结构信息,可以通过class对象得出类的结构。

    相当于 镜子。

    11.

     12.

     13.反射后可以得到的信息:

    某个类的属性、方法、构造器,实现了哪些接口,

    14.

     15.

     

     16.

     他们的class对象是什么

     

     17.反射的API

     constructor.newInstance();
            
            /**
             * 获取方法
             * 
             */
            //获取___类中所有的public修饰的方法,其中包括父类的方法。
            //如果还要获取所有的方法用getDeclaredMethods()方法
            Method[] methods = rName.getMethods();
            //获取___指定的方法,这获取的是无参方法,
            //要获取有参的请在行参列表上写上(指定的方法名,数据类型1.class,数据类型2.class);
            Method method = rName.getMethod(方法名);
            //调用___非static修饰的方法需要invoke(对象,实参1,实参2),
            //有static修饰的方法需要invoke(null,实参1,实参2)。
            //我这调用的非static修饰方法没有参数就只需一个对象
            method.invoke(newInstance);
            /**
             * 获取字段
             * 
             */
            //获取___类中的public字段。如果还要获取所有的字段用getDeclaredFields()方法
            Field[] fields = rName.getFields();
            //获取___指定的字段。
            Field field = rName.getDeclaredField(指定的字段名);
            //设置___指定的字段,非static修饰,set(对象,值);有static修饰,set(null,值)
            field.set(newInstance,5.2);
            //调用___指定字段的值,非static修饰,get(对象);有static修饰,get(null)
            Object object = field.get(newInstance);
            System.out.println("指定字段的值=="+object);
            
            /**
             * 破坏包装declaredField.setAccessible(boolean)破坏封装,可以调用私有成员
             * true:破环
             * false:默认值,不破坏
             */
            Field field2 = rName.getDeclaredField(私有化的字段名);
            //破坏封装,不让字段私有化
            field2.setAccessible(true);
            //设置字段的值
            field2.set(newInstance,值);
            //调用设置后的字段值,并打印
            Object object2 = field2.get(newInstance);
            System.out.println("破坏封装==="+object2);
            
            //获取全限定类名
            String name = rName.getName();
            System.out.println("全限定类名: "+name);
            
            //获取类名简写
            String simpleName = rName.getSimpleName();
            System.out.println("类名简写: "+simpleName);

    18.在这个实例下 输出两个hashCode值相等

    19.根据class对象新建一个对象(无参构造器)

     新建一个有参构造器生成一个对象

     通过反射 得到方法method 然后使用invoke进行传参

    通过反射得到属性 然后进行赋值。要记得打开可达性

     19.通过反射获得注解的信息(包括注解的value值等)

     

     

     

  • 相关阅读:
    数据库索引(Oracle和Mysql)学习总结
    个人开源Git地址
    关于SQL优化这些你了解吗?
    Java项目排查cpu负载高
    Java Bean与Map之间相互转化的实现
    Maven项目改为spring boot项目的方法
    spring boot从redis取缓存发生java.lang.ClassCastException异常
    MySQL优化之Explain命令解读
    阿里巴巴校招四面经验分享
    HDBS之应用代码优化
  • 原文地址:https://www.cnblogs.com/cckong/p/14328538.html
Copyright © 2011-2022 走看看