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

  • 相关阅读:
    Linux下安装破解JIRA 6.3.6 并连接MYSQL5
    centos7 系统安装问题汇总
    CentOS7安装iptables防火墙
    Vue全家桶实战 从零独立开发企业级电商系统
    小米笔记本pro充电10秒断开
    mac电脑的使用
    autojs解决方案
    auto.js连接vscode
    小米6手机刷机亲测详解
    #002前端基础-JS-浏览器中堆栈内存的底层处理
  • 原文地址:https://www.cnblogs.com/tyxuanCX/p/9932686.html
Copyright © 2020-2023  润新知