![7719edddfa2f0e9f5c9c49ed93c36a15.png](https://img-blog.csdnimg.cn/img_convert/7719edddfa2f0e9f5c9c49ed93c36a15.png)
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
![7719edddfa2f0e9f5c9c49ed93c36a15.png](https://img-blog.csdnimg.cn/img_convert/7719edddfa2f0e9f5c9c49ed93c36a15.png)
2. ORM
Object Relationship Mapping 对象与关系型数据结构之间的映射
![7719edddfa2f0e9f5c9c49ed93c36a15.png](https://img-blog.csdnimg.cn/img_convert/7719edddfa2f0e9f5c9c49ed93c36a15.png)
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 GenericArrayType: 泛型数组类型 WildcardType: 通配符类型 Method中对类型的操作 getGenericParameterTypes 获取所有参数类型 getReturnType 获取返回值类型 ParameterizedType中对泛型的操作 getActualTypeArguments 获取该类型的所有泛型 熟练掌握Class, Method, Field, Constructor类和Type接口 反射会降低程序效率, 普通方法效率是反射的30倍
![7719edddfa2f0e9f5c9c49ed93c36a15.png](https://img-blog.csdnimg.cn/img_convert/7719edddfa2f0e9f5c9c49ed93c36a15.png)
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变量
![7719edddfa2f0e9f5c9c49ed93c36a15.png](https://img-blog.csdnimg.cn/img_convert/7719edddfa2f0e9f5c9c49ed93c36a15.png)
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);