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