美文网首页
Java高级特性整理

Java高级特性整理

作者: ZoranLee | 来源:发表于2022-02-15 18:28 被阅读0次
    Java高级特性.png

    Java高级特性

    反射

    使用场景

    1、无法使用new关键字来创建对象
    2、在运行状态中,对任意一个类都能够知道这个类的所有属性和方法
    3、都能够调用他的任意方法和属性,并且能改变他的属性【动态语言的关键】
    

    功能

    1、在运行时构造任意一个对象
    2、运行时获取或修改任意一个类所具有的的成员变量和方法
    3、在运行时调用任意一个对象的方法
    

    获取Class对象方式

    1、类名.class
    2、对象名.getClass()
    3、Class.forName("")
    

    判断是否为类的实例

    1、isInstance 关键字来判断是否为某个类的实例
    2、isAssignableFrom 是否为某个类的类型
    

    创建实例

    • newInstance
    Class<?> c = String.class;
    Object str = c.newInstance();
    public T newInstance(Object ...initargs)
    
    • Constructor
    Constructor constructor = c.getConstructor(String.class);
    Object obj = constructor.newInstance("222222")//带String参数的构造器
    
    getConstructor(Class[] params) 获取使用特殊的参数类型的public构造函数(包括父类)
    getConstructors() 所有的公共函数
    getDeclaredConstructor(Class[] params) //使用特定参数类型的构造函数
    

    成员变量信息

    1、Field getField(String name) 获得命名的公共字段
                
    2、getFields() 获得类的所有公共字段
                
    3、getDeclareField(String name) 获得类声明的命名字段
                
    4、Field[] getDeclaredFields(); 获得类声明的所有字段
    

    调用方法

    invoke(Object obj,Object ...args)
    
    获得方法信息
    getMethod(String name,Class[] params)//使用特定的参数类型,获得命名的公共方法
    getMethods() //获得类的所有方法
    getDeclareMethod(String name,Class[] params) 使用特写的参数类型,获得类声明的命名方式
    getDeclaredMethods() 获得类声明的所有方法
    
    数组
    newInstance(Class<?> componentType,int length)
    

    获取泛型真实类型

    TypeVariable【泛型类型变量】

    public class TestType <K extends Comparable & Serizlizable ,V>{
        K key;
        V value;
        public static void main() throws Exception{
        //获取字段的类型
        Field fk = TestType.class.getDeclaredField("key");
        Field fv = TestType.class.getDeclaredField("value");
    
        TypeVariable keyType =  (TypeVariable)fk.getGenericType();
        TypeVaiable valueType = (TypeVariable)fv.getGenericType();
    
        keyType.getName();//K
        valueType.getName();//V
    
        keyType.getGenericDecalaration();// class com.test.TestType
        valueType.getGenericDecalaration();// class com.test.TestType   
    
        for(Type type:keyType.getBounds()){//keyType 有两个上界
            type;//interface java.lang.Comparable //interface java.io.Serizlizable
        }   
      }
    }
    

    ParameterizedType 具体的泛型类型

    public class TestType{
        Map<String,String> map;
        public static void main(String [] args){
    
        Field f =   TestType.class.getDeclaredField("map");
        f.getGenericType();//interface java.util.map<java.lang.String,java.lang.String>
        
        ParameterizedType pType =   (ParamseterizedType)f.getGenericType();
        pType.getRawType();// interface java.util.map
        for(Type type : pType.getActualTypeArguments()){
            System.out.println(type)
        }
    }
    }
    

    GenericArrayType 泛型类的数组

    public class TestType<T>{
        List<String>[] lists;
        public static void main(String[] args){
            Field f =TestType.class.getDeclaredField("lists");
            GenericArrayType genericType = (GenericArrayType)f.getGenericType();
        }
    }
    

    WildcardType 通配符泛型

        public class TestType{
        private List<? extends Number> a;
        private List<? super String> b;
        
        public static void main(){
            Field fieldA = TestType.class.getDeclaredField("a");
            
            ParameterizedType pTypeA = (ParameterizedType)fieldA.getGenericType();
            
            WildcardType wTypeA =(WildcardType)pTypeA.getActualTypeArguments()[0];
            wTypeA.getUpperBounds()[0];//class java.lang.Number
        }
    }
    

    注解(Java标注)

    基本描述

    1、JDK5.0引入的一种注释机制;
    2、元数据的一种形式;
    3、提供有关于程序但不属于程序本身的数据

    Annotation

    注解默认实现Annotation接口

    public @interface Lan{}
    public interface Annotation {
        boolean equals(Object obj);
        int hashCode();
        String toString();
        Class<? extends Annotation> annotationType();
    }
    

    元注解(meta-annotation、注解的注解)

    @Target (可以应用的元素类型)
                    ElementType.Annotation_TYPE 用于注解类型
                    ElementType.Constructor 应用于构造函数
                    ElementType.Field 应用于字段或者属性
                    ElementType.Local_variable 局部变量
                    ElementType.Method 方法级注解
    
    @Rention (注解的存储位置)
                    RetentionPolicy.SOURCE 源级别
                    RetentionPolicy.class 标记的注解在编译时保留
                    RetentionPolicy.RUNTIME 标记的注解由JVM保留,运行时环境
    

    IDE语法检查

    @IntDef 替换枚举

    APT【Annotation Processor Tools】

    Glide、EventBus3、ButterKnifer、Tinker、Arouter
    

    Class

    isAssignableFrom【类的关系】

    - 判断子类和父类的关系的,或者接口的实现类和接口的关系    
    - A.isAssignableFrom(B) 确定一个类(B)是不是继承来自于另一个父类(A),一个接口(A)是不是实现了另外一个接口(B),或者两个类相同
    

    isAnnotationPresent

    指定类型的注释存在于此元素上
    

    泛型

    • 泛型类
    • 泛型方法
    • 通配符
      ? extends X【类型的上界】
      ? super X 【类型的下界】
      ? 无限定的通配符

    虚拟机实现原理

    1、只在程序源码中存在
    2、编译后的字节码文件中,替换为原生类型(Raw Type,也称为裸类型)
    3、强制转型代码
    4、类型擦除【伪泛型】
    Signature 存储方法在字节码层面的特征签名,包括参数化类型

    相关文章

      网友评论

          本文标题:Java高级特性整理

          本文链接:https://www.haomeiwen.com/subject/xcyllrtx.html