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

相關文章
相關標籤/搜索