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. Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

    if first time to install docker, be noted the docker engine started as root copied from: http://blog ...

  2. zay大爷的神仙题目 D1T1-大美江湖

    在前几天的时候,千古神犇zay(吊打zhx那个)出了一套神仙题目,所以我得来分析分析QWQ 先补个网易云链接QWQ 毕竟是T1嘛,还算是比较简单的,那道题,读完题目就发现是个中等模拟(猪国杀算大模拟的 ...

  3. leetcode 437 Path Sum III 路径和

      相关问题:112 path sum /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNo ...

  4. 淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】

    json package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.core.JsonP ...

  5. Cloudera-JDBC-Driver-for-Apache-Hive

    Cloudera-JDBC-Driver-for-Apache-Hive-Install-Guide.pdf https://github.com/FlowerBirds/flowerbirds.gi ...

  6. CDS究竟是个什么鬼?它直接导致了次贷危机?

    周五,中国银行间市场交易商协会就确认了这一消息,信用违约互换(CDS)和信用联结票据(CLN)业务指引在今日正式发布实行. 当然,这则消息在中国普通投资者当中还没引起足够关注,但是在很多人看来CDS这 ...

  7. RequestContextHolder获取request和response

    RequestContextHolder获取request和response 2019年03月16日 15:18:15 whp404 阅读数:21更多 个人分类: Spring   首先需要在web. ...

  8. [ScreenOS] How to change the certificate that is used for SSL (HTTPS) WebUI Management

    SUMMARY: This article provides information on how to change the certificate that is used for SSL (HT ...

  9. Grafana设置匿名登录

    将配置文件中的auth.anonymous的enabled设置为true就可以匿名登录,不用输入用户名和密码 #################################### Anonymou ...

  10. Clover的简单使用

    官网: http://cn.ejie.me 操作说明相关: 方便的 Tab 页功能 要掌握功能强大,操作简单的标签页,只需记住Ctrl+T新开页面,Ctrl+W关闭页面,Ctrl+Tab切换页面,工作 ...