Java Annotation 刷课笔记(二)
1.反射机制性能问题(安全检查)
1.1setAccessible
启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消Java语言访问检查,值为false,则指示反射的对象应该实施Java语言的访问检查。
1.试验一,普通调用10亿次,需要约2258ms。
2.试验二,普通反射invoke调用10亿次,需要接近普通调用的30倍速度,大约62kms。(这就是反射的缺点)
3.试验三,设置通过安全检查,则,提高约4倍速度,10kms左右。
反射操作泛型
2.反射操作泛型
2.1.介绍
- Java采用泛型擦除机制引入泛型,Java中的泛型仅仅是编译器javac使用的,确保数据的安全性,避免反射转换的麻烦。但是,一旦编译完成,所有与泛型有关的类型全部擦除。
- 为了通过反射操作类型,硬核实际需要,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能归并到Class类型但是又和原始类型齐名的类型。
- ParaneterizedType 参数化类型,如Colloection<String>
- GenericArrayType 参数类型或者变量数组
- TypeVariable 各种类型变量的公共父接口
- WildcardType 通配泛型表达式,比如?, ? extends Number, ? super Integer
public void test01(Map<Integer, String> map, List<User> list) {
System.out.println("aa");
}
public static void print() throws NoSuchMethodException {
Method m = A.class.getMethod("test01", Map.class, List.class);
Type[] t = m.getGenericParameterTypes();
for (Type t1 : t) {
Type[] genericTypes = ((ParameterizedType) t1).getActualTypeArguments();
for (Type ty : genericTypes) {
System.out.println(ty);
}
}
}
3.动态编译
3.1.介绍
Java6.0引入动态编译机制
3.2.动态编译应用场景
- 浏览器编写java代码,上传服务器编译和运行的在线评测系统
- 服务器动态加载文件进行编译
3.3.编译的两种做法
- 通过Runtime调用javac,启动新的进程操作动态(运行编译后内容)
Runtime run=Runtime.getRuntime(); Process process=run.exec("java -cp d:/myjava/ HelloWorld.java");
- 通过JavaCompile动态编译
public static int compileFile(String sourceFile){ JavaCompiler compiler=ToolProvider.getSystem.JavaCompiler(); int result=compiler.run(null,null,null,sourceFile); System.out.println(result==?"编译成功":"编译失败"); return result; }
3.4.动态运行编译后的程序
- 3.4.1.process可以获取一个输入流(3.3.1中),可以用BufferdedRead进行打印结果值
- 3.4.2.用类加载器加载类,获取方法执行
4.脚本引擎执行javascript代码
4.1使用ScriptEngineManager
ScriptEngineManager sem=new ScriptEngineManager(); ScriptEngine engine=sem.getEngineByName("javascript"); engint.put("msg","a good man"); engine.eval("计算");
5.javaassist库介绍
5.1.介绍
- 可以进行字节码操作
5.2.运行操作字节码可以实现
- 动态生成新的类
- 动态改变类的结构
5.3.优势
- 比反射开销小,性能高
5.4常见字节码操作类库
- BAEL
Byte Code Engineering Library, 这是Apache Software Foundation的Jakarta项目的一部分,BCEL是Java Classworking钢钒使用的一种框架,它可以让您深入JVM汇编语言进行类操作,BCEL与Javaassist有着不同处理字节的方法,BCEL实际JVM指令操作BCEL,拥有丰富的JVM指令支持编译源码级别工作
- ASM
一个轻量级的操作Java字节码的框架,直接注射剂JVM底层的操作和指令
- CGLIB(Code Generation Library)
一个强大的,高性能,高质量的Code生成类库,基于ASM实现
- JavaAssist
编译和创建Java字节码的类库,性能较ASM差,跟CGLIB差不多,但是使用简单,很多开源框架都适用
Java Annotation 刷课笔记(二)的更多相关文章
- Java Annotation 刷课笔记(一)
1.什么是注解? 1.1.Annotation是从JDK5.0引入的新技术 1.2.Annotation的作用: 不是程序本身,可以对程序作出解释(这一点,和注释没什么区别) 可以被其他程序(比如编译 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java加密与解密笔记(二) 对称加密
前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...
- Java Annotation详解(二): 反射和Annotation
前面一篇文<Java Annotation详解(一): 理解和使用Annotation>中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation ...
- 深入理解Java虚拟机之读书笔记二 垃圾收集器
1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roo ...
- 《深入理解Java虚拟机》学习笔记(二)
垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...
- Java常用类库 读书笔记 二
1.Date类 常用操作方法: public Date () 构造方法,实例化Date类对象 public Data(long Date) ...
- Java逍遥游记读书笔记<二>
Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...
- 《深入理解java虚拟机》读书笔记二——第三章
第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...
随机推荐
- (转)openssl 命令: openssl req 命令详解
openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书.本文就主要记录一下open ...
- jquery.fileupload-image-editor.js
jquery.fileupload-image-editor.js中 _initEventHandlers: function () { this._super(); var handlers = { ...
- windows server 2008 r2 配置ftp (FileZilla Server )
1.需要个ftp 2.在华为云内部,用IIS,配置后如果用主动模式,客户端需要配置后客户端需要做配置才能访问,去掉√,见下图. 3.华为云的教程,配被动需要把1024以上的端口都放开,不安全! 但客户 ...
- 一、基础篇--1.1Java基础-抽象类和接口的区别
抽象类和接口的区别 抽象类和接口在设计层面的区别主要体现在:接口是对动作的抽象,抽象类是对根源.类的抽象.抽象类表示的是,这个对象是什么,接口表示的是,这个对象可以做什么. 比如,男人.女人是人,人是 ...
- nginx检查报错:nginx: [emerg] "server" directive is not allowed here in
想检查一个配置文件是否正确,-c 指定之后发现有报错,如下: [root@op-2:~# nginx -t -c /etc/nginx/conf.d/default.conf nginx: [emer ...
- TP3.2写分页
用TP3.2写分页 手册上说的好难懂,我自己去网上找资料 ,现在整理一下,以后可能会用: 在Think下面有Page.class.php类: 我在这个下面放了一个function.php的(算是类吧又 ...
- spring hibernate 事务整合 使用测试类 事务不自动提交的问题!!!
使用JUnit 测试hibernate 事务管理的时候应注意 ,测试类完成是默认回滚的. 所以只能查询数据库却不能增删改数据库. 应该在测试类上面加上注解 @Rollback(false) 表似默认 ...
- 中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零
期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ...
- windows 的cmd设置代理的问题
今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要 ...
- awk结合数组统计
1.统计用户登录类型 #!/bin/bashdeclare -A shells (定义关联数组shells)while read ll (读取/etc/passwd,ll为变量) dotype= ...