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
@Inheritedjavascript
注解操做
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倍java
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);编程