Java高级特性整理

2022-02-15  本文已影响0人  ZoranLee
Java高级特性.png

Java高级特性

反射

使用场景

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

功能

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

获取Class对象方式

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

判断是否为类的实例

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

创建实例

Class<?> c = String.class;
Object str = c.newInstance();
public T newInstance(Object ...initargs)
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

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

泛型

虚拟机实现原理

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

上一篇 下一篇

猜你喜欢

热点阅读