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);編程