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 存储方法在字节码层面的特征签名,包括参数化类型
网友评论