1. 程式人生 > >Java高階應用簡筆

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