Annotation和动态性
内置注解
如@override 表示是重写方法
@Deprecated 废弃方法 不建议使用
@SuppressWarnings(“all”) 抑制所有警告信息 unchecked path之类的警告
自定义注解
元注解类型
@Target 说明注解范围
PACKAGE TYPE(类 接口 枚举 annotation ) CONSTRUCTOR 描述构造器 FIELD 描述域 METHOD
LOCAL_VARIABLE PARAMETER
@Retention
SOURCE 源文件中有效
CLASS class文件中有效
RUNTIME 运行时有效 可以被反射读取
注解参数
String stuName() default " ";
只有一个参数一般命名为value 因为不输入参数名的话默认是value
反射读取注解
方便程序读取
如将类对象转化为数据库中的表
在类中加入表明的注解 属性上加入列名 类型 长度的注解 解析程序就可以读取相应的注解 完成转化
动态性(反射 动态编译 动态执行js 动态字节码操作)
反射
运行时加载 探知 使用编译期间完全未知的类(类似于不知道数组的类型?很棒的功能)
动态加载类之后,就产生了一个Class对象 一个类只有一个Class对象 有了这个对象 就可以完全知道类的结构,像一面镜子反射一样
1 获取反射对象
Class.forName(包名.类名)
String.class
对象.getClass() 或者路径.getClass
int[] a1 = new int[10]
int[] a2 = new int[20]
a1.getClass() 和 a2.getClass 是一样的 同类型同维度的数组class对象是相同的
2.反射机制的性能
setAccessible false 禁止安全检查 提高效率
3.反射操作泛型
ParameterizedType 表示参数化类型 e.g. Collection
GenericArrayType 表示数组类型 数组元素的类型是参数化类型或者类型变量
TypeVariable 各种类型变量的公共父接口
WildcardTyoe 代表通配符类型表达式 ? ?extends Number ? super Integer
动态编译
javaCompiler
public static int complieFile(String sourceFile){
//动态编译
JavaCompiler compiler = ToolProvider.getSystem.JavaCompiler()
int result =compiler.run(null,null,null,sourceFile)
//result 0成功
}
参数1:为java编译器提供参数
2:得到编译器输出信息
3:接收错误信息
参数4 可变参数 String数组 传入多个java源文件
脚本引擎执行js
java字节码操作
创建一个全新的类
使用XJAD反编译 class文件到java文件
javassist 操作注解
public @inteface Author{
String name();
int year();
}
@Author(name="xja",yaer=2018)
public class Point{int x,y;}
//通过类对象获得注解
Ctclass cc= ClassPool.getDefault().get("Point");
Object[] all = cc.getAnnotations();
Author a =(Author) all[0];
String name = a.name();
int year = a.year();
System.out.println(name+year)