Java高级应用简笔

摘要:
1.注释的用法范围:package、class、method、field Common:@Override、@Deprecated、@SuppressWarnings自定义注释:@Target(ElementType.field)public@interfacePerson{Stringname()默认值“”;intid()默认

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

免责声明:文章转载自《Java高级应用简笔》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python读写excel部署在IIS服务器的asp.net 网站,禁止访问指定类型文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

nacos产生大量日志处理

/我们发现nacos产生大量日志,浪费磁盘空间资源将配置文件nacos/conf/application.properties的生产日志功能关闭--进入配置文件vim./nacos/conf/application.properties--将true改为falseserver.tomcat.accesslog.enabled=true--重启nacos./n...

POI操作word和html相互转化

下面是里两个类:第一个类是html转为word,第二个是word转html(最下面附上jar包下载链接)packagecom.wz.poi.wordHtml;/***2018/4/24*@authorAdministrator**/importjava.io.BufferedReader;importjava.io.ByteArrayInputStream;...

git:将两个请求合并为一个请求

Gitrebase ihEAD~2解释:此命令可以以文本形式显示您提交的两次请求。如果数字2被4替换,则您最近四次提交的信息将显示如下:1 pick56a06efchange1:删除一个空白行2 pickedbeab5change2:addlogonMainActivity34#Rebase23198ba..Edbeab5onto23198ba5#6#命令:...

SQLServer2008/2012 安装、添加sa用户和密码、多实例安装、修改端口, 重启生效

因为我们无法使用sa用户登录,所以只能使用系统登录。登录后,我们需要修改相关属性。右键单击数据库,然后单击属性。在这个sa的登录属性对话框中,我们首先需要设置这个用户的密码。由于此用户名是系统的用户,我们可以直接填写密码,然后再次确认密码。然后在对话框中,单击左上角的第二个属性服务器角色。这是您要实现的添加用户的角色。...

sqlserver2016安装

2008以前的版本在SQLserver配置管理其中设置。...

Crontab详细用法-定时任务详解

LWC“八个字符,有效范围为0-31个月的整数:可以出现”,-*/“四个字符,无效范围为1-12或JAN DECDayofWeek:可以出现”。-*/?因为月日和周日将相互影响。例如,在“分钟”字段中使用5,20表示它将在每分钟的5和20分钟触发一次。50:表示它只能出现在周日和月日域中。如果在DayofWeek域中使用5L,这意味着它将在最后一个星期四触发...