注解和动态性

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值