Java高级应用简笔
1. Annotation
使用范围: package, class, method, field
常用: @Override, @Deprecated, @SuppressWarnings
自定义注解:
@Target(ElementType.FIELD)
public @interface Person{
String name() default "";
int id() default 0;
}
元注解:
@Target(ElementType.FIELD): 使用域为属性
@Retention(RetentionPolicy.RUNTIME): 运行时可用
@Documented
@Inherited
注解操作
java.lang.Class对象的注解相关方法(以下注解来自类, 属性,方法也有相似操作)
getAnnotation, getAnnotations, isAnnotationPresent, getAnnotationsByType
getDeclaredAnnotationsByType, getDeclaredAnnotation, getDeclaredAnnotations
2. ORM
Object Relationship Mapping
对象与关系型数据结构之间的映射
3. 反射机制
基于java.lang.Class对象
获取类名: getName, getSimpleName
获取属性信息: getField, getFields, getDeclaredField, getDeclaredFields
获取方法: getMethod(有参方法要传入参数类型), getMethods, getDeclaredMethod, getDeclaredMethods
获取构造器: getConstructor, getConstructors, getDeclaredConstructor, getDeclaredConstructors
setAccessible(true), 设置取消访问检查
java具有泛有擦除机制: java类在加载后, Class对象并没有泛型, 泛型只是给编译器使用的
ParameterizedType: 带泛型的参数类型, 如Collection<String>
GenericArrayType: 泛型数组类型
WildcardType: 通配符类型
Method中对类型的操作
getGenericParameterTypes 获取所有参数类型
getReturnType 获取返回值类型
ParameterizedType中对泛型的操作
getActualTypeArguments 获取该类型的所有泛型
熟练掌握Class, Method, Field, Constructor类和Type接口
反射会降低程序效率, 普通方法效率是反射的30倍
4. 动态编译
Runtime调用javac
Runtime r = Runtime.getRuntime();
Process process = r.exec("javac -cp /src/main/java/com/galaxy/util/ StringUtil.java");
JavaCompiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "c:/myjava/HelloWorld.java");
脚本引擎执行JavaScript代码
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
使用ScriptEngine对象的put将需要执行的js代码放入引擎, 再eval调用put进引擎的代码, get可以拿到js变量
5. 字节码操作
java动态性: 字节码操作, 反射
字节码操作使用: 动态生成新的类, 动态改变类结构
优势: 比反射开销小,性能高, Javassist性能比反射高,比ASM低
常见字节码操作类库:
BCEL(Byte Code Engineering Library) JVM汇编语言进行类的细节操作
ASM轻量级java字节码操作框架, 直接涉及JVM底层操作指令
CGLIB(Code Generation Library)基于ASM实现更强大的,高性能的,高质量的Code生成类库
Javassist分析编辑创建java字节码,开源,使用简单与cglib相似
Javassist
AOP(Aspect Oriented Programming, 面向切面编程)
Reflection
主要类:
CtClass
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("com.bjsxt.bean.Emp");
CtMethod
CtMethod m1 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc);
cc.addMethod(m1);
CtField
CtField f1 = CtField.make("private int empno;", cc);
cc.addField(f1);
CtConstructor
CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, cc);
constructor.setBody("{this.empno=empno; this.ename=ename;}");
cc.addConstructor(constructor);
Java高级应用简笔的更多相关文章
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- paip.java 架构师之路以及java高级技术
paip.java 架构师之路以及java高级技术 1. Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- Java高级之线程同步
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于实现多线程的意义,"从业四年看并发"一文已经讲述,而本篇主要讲一下常用的设计 ...
- Java高级之类结构的认识
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java体系包括,各种版本的虚拟机,可执行文件,各种第三方类库,Java API类库,Java语言 ...
- Java高级软件工程师面试考纲(转)
如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...
- Java高级软件工程师面试考纲
如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...
- 黑马程序员——Java高级应用(一)
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
随机推荐
- BZOJ 3687: 简单题 bitset
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...
- command not found所有执行命令总是报找不到
输入 ll命令 提示: bash: ls: 未找到命令… 相似命令是: 'lz' 原因: 环境变量PATH被修改了 解决办法: 执行: export PATH=/bin:/usr/bin:$PATH ...
- Linux 修改zabbix server的web访问端口
在安装zabbix server的时候默认就安装了apache,zabbix依靠apache提供的web服务,修改Zabbix的浏览器访问端口,就是修改apache的服务端口(默认端口:80) 1.编 ...
- 基于前台vue,后台是spring boot的压缩图片上传
本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot.其中有一个需求是需要做前端上传的图片需要压缩才能上传.为此在网上查找资料,并做了简单的实现. 那么一步来 ...
- oracle DML语句
DML语句 1. 插入数据 创建一个新表 create table new_cust as select * from customers --使用insert语句添加行 /* 确定要插入的行所在的 ...
- 使用ThreadPoolExecutor进行多线程编程
ThreadPoolExecutor有四个构造函数,分别是: 1,ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keep ...
- POC iis短文件名
__author__ = '*'# -*- coding:utf-8 -*- from lib.httpparse import httpparse def verify(protocol,ip,po ...
- Matplotlib-多图合并显示
Subplot 多合一显示 均匀图中图 不均匀图中图 # 均匀图中图 # matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. # 使用impor ...
- python中的全局变量和局部变量
python中,对于变量作用域的规定有些不一样. 在诸如C/C++.java等编程语言中,默认在函数的内部是能够直接訪问在函数外定义的全局变量的,可是这一点在python中就会有问题.以下是一个样例. ...
- ArcGIS 图层旋转工具-arcgis案例实习教程
ArcGIS 图层旋转工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对输入图层执行坐标旋转 使用方法:输入图层,旋转中心,旋转 ...