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 刷课笔记(二)的更多相关文章

  1. Java Annotation 刷课笔记(一)

    1.什么是注解? 1.1.Annotation是从JDK5.0引入的新技术 1.2.Annotation的作用: 不是程序本身,可以对程序作出解释(这一点,和注释没什么区别) 可以被其他程序(比如编译 ...

  2. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  3. Java加密与解密笔记(二) 对称加密

    前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...

  4. Java Annotation详解(二): 反射和Annotation

    前面一篇文<Java Annotation详解(一): 理解和使用Annotation>中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation ...

  5. 深入理解Java虚拟机之读书笔记二 垃圾收集器

    1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roo ...

  6. 《深入理解Java虚拟机》学习笔记(二)

    垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...

  7. Java常用类库 读书笔记 二

    1.Date类 常用操作方法: public Date ()                         构造方法,实例化Date类对象 public Data(long Date)       ...

  8. Java逍遥游记读书笔记<二>

    Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...

  9. 《深入理解java虚拟机》读书笔记二——第三章

    第三章 垃圾收集器与内存分配策略 1.判断对象是否已死 引用计数法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,每当引用失效时,计数器值就减1. 任何时刻计数器为0的对象就是不 ...

随机推荐

  1. matplotlib画图——条形图

    一.单条 import numpy as np import matplotlib.pyplot as plt N = 5 y1 = [20, 10, 30, 25, 15] y2 = [15, 14 ...

  2. 测试版和正式版微信小程序共享存储空间问题

    一般习惯将变量存储在小程序的storage缓存中,然后用到的时候再去取.但是有一次我在做小程序相关内容的时候发现,对于苹果手机,测试版本小程序和正式版本小程序的缓存变量是相互通用的.

  3. leetcode 回文二叉树

    C++最简单的方法,遍历存在vector<int> ivec容器中,然后头尾对应比较 O(n)时间,O(n)空间 /** * Definition for singly-linked li ...

  4. IE浏览器中图片路径正确< img ... />标签不显示图片

    如下图所示,下面的html要去加载上面的jpg图片: 代码如下: <img src="luzhanshi1.jpg" alt="图片加载失败"> 使 ...

  5. SELECT-OPTIONS对象

    1. SELECT-OPTIONS基本语法及定义 SELECT-OPTIONS通常用于参照一数据库字为建立数据输入域,其定义对象命名长度不能超过8位,其产生的屏幕对象最大输入长度为18位,语法如下: ...

  6. mysql数据库delete数据时不支持表别名!!!

    mysql数据库delete数据时不支持表别名!!! mysql delete时候 提示语法错误!如下sql: 去掉 表别名的时候: 正确的写法例如: DELETE FROM COMMENTS_REP ...

  7. Burp Suite批量网页操作

    1.打开md5解密网站,并输入“21232F297A57A5A743894A0E4A801FC3”,不要点击[Decrypt It!] 1.启动Burp Suite,并设置浏览器代理 3.点击[Dec ...

  8. 19. Jmeter抓包之浏览器请求

    web测试过程中我们经常需要抓包,通常我们使用fiddler或者Charles.但是jmeter也可以抓包,而且非常好用,闲话不多说,下面进入正题.下面用一个例子进行说明 需求:bing首页搜索南京测 ...

  9. Scratch少儿编程系列:(一)版本的选择及安装

    工欲善其事必先利其器,为了使用Scratch,首先要到官网上下载相关软件. 官网链接地址为:https://scratch.mit.edu/download,我用的是Windows系统,下载对应的安装 ...

  10. /etc/syscofig/network 修改主机名

    [root@mysql ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=mysql