精华内容
下载资源
问答
  • Java属性为什么不能is开头的boolean通常定义Java实体时,对于boolean属性,阿里规约中明确要求不能使用is开头。至于为什么,我们稍后再讲。这里先讲一下前几天在工作中,项目遇到的一个问题。库表中某个字段存入...

    Java属性为什么不能是is开头的boolean

    通常定义Java实体类时,对于boolean属性,阿里规约中明确要求不能使用is开头。

    d3b529a15848bc6f9697498df7edd1fc.png

    至于为什么,我们稍后再讲。

    这里先讲一下前几天在工作中,项目遇到的一个问题。库表中某个字段存入了一个实体类的json字符串,在查询库表后,需要将json字符串转为实体类对象进行更改后再转为json字符串后返回给前端。

    在这当中就出现了一个问题,库表中存入的数据明明是isUpdate的字段,可是在返回到前端后的代码就是update。

    这个问题,起初并没有想到是字段定义的问题,通过一步一步的debug,最后才发现是实体类中isUpdate字段的问题,在通过json解析后就转成了update返回给了前端。

    下面讲一下,为什么会出现isUpdate变成update的问题。

    首先,我们先定义一个Java实体类,包含一个is开头的属性,如isSuccess,再使用idea自动生成的get/set,看看是什么样子。

    public class IsEntity1 {

    private boolean isSuccess;

    public boolean isSuccess() {

    return isSuccess;

    }

    public void setSuccess(boolean success) {

    isSuccess = success;

    }

    }

    然后再定义一个Java实体类,不是用is开头的属性,如success,再使用idea自动生成的get/set,看看是什么样子。

    public class IsEntity2 {

    private boolean success;

    public boolean isSuccess() {

    return success;

    }

    public void setSuccess(boolean success) {

    this.success = success;

    }

    }

    此时,会发现无论你是用is开头或者不用is开头定义属性,使用idea自动生成的get/set都是一个样子的,而且在setSuccess的时候,会将is省略掉。这里就是项目中遇到的问题所在。

    因为当类进行序列化时,有些框架的序列化会根据JavaBean的属性进行序列化,而部分框架是根据JavaBean的getter方法进行序列化,这就会导致在反序列化时与实体类的属性对应不上。

    比如说将IsEntity1转换为json字符串时,会根据实体类中的get方法进行序列化取isSuccess的值,而使用idea自动生成的get方法直接就是public boolean isSuccess()方法,在取值的时候会认定success是字段名,就会取成success,与原来定义的字段不同。

    如果非要使用is开头来定义字段,怎么才能保证json解析过程是正确的呢

    答案是自己写get方法,不用idea自动生成的get方法。

    如下:

    public boolean getIsSuccess() {

    return isSuccess;

    }

    这样,再将实体类转为json字符串时,就会认定isSuccess是字段名。

    还有一种方法,就是使用JSONField注解

    @JSONField(name = "isSuccess")

    private boolean isSuccess;

    虽然这些方法都可以解决json解析过程丢失is的问题,但是为了避免出现这种问题,我们最好还是遵守规约,不使用is开头定义字段。

    展开全文
  • 我们自己编写的Java类默认情况下都由系统类加载器加载。系统类加载器也ClassLoader的子类,也通过调用ClassLoader.loadClass(name)方法来加载类,而扩展ClassLoader类的一般做法就是重写findClass(name)方法,...

    转自 http://blog.csdn.net/zhangzeyuaaa/article/details/42531135

    我们自己编写的Java类默认情况下都由系统类加载器加载。系统类加载器也是ClassLoader的子类,也是通过调用ClassLoader.loadClass(name)方法来加载类,而扩展ClassLoader类的一般做法就是重写findClass(name)方法,然后调用defineClass(String name, byte[] b, int off, int len)返回。所以我们可以直接看ClassLoader的defineClass(String name, byte[] b, int off, int len)方法。

    defineClass(String name, byte[] b, int off, int len)方法:

    1. protected final Class<?> defineClass(String name, byte[] b, int off, int len)  
    2.     throws ClassFormatError  
    3.     {  
    4.     return defineClass(name, b, off, len, null);  
    5.     }  
    defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)方法:
    1. protected final Class<?> defineClass(String name, byte[] b, int off, int len,  
    2.                      ProtectionDomain protectionDomain)  
    3.     throws ClassFormatError  
    4.     {  
    5.     check();  
    6.     protectionDomain = preDefineClass(name, protectionDomain);  
    7.   
    8.     Class c = null;  
    9.         String source = defineClassSourceLocation(protectionDomain);  
    10.   
    11.     try {  
    12.         c = defineClass1(name, b, off, len, protectionDomain, source);  
    13.     } catch (ClassFormatError cfe) {  
    14.         c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source);  
    15.     }  
    16.   
    17.     postDefineClass(c, protectionDomain);  
    18.     return c;  
    19.     }  
    preDefineClass(String name,ProtectionDomain protectionDomain)方法有如下一段代码:
    1. if ((name != null) && name.startsWith("java.")) {  
    2.         throw new SecurityException("Prohibited package name: " +  
    3.                     name.substring(0, name.lastIndexOf('.')));  
    4.     }  
    如果类名不为空,并且以java.开头,就抛出异常!

    当然,检测包名不只这么简单,正式加载字节码文件的时候还会对包名进行检测。

    展开全文
  • 这里说一下为什么自定义的包不能以 java.xxx.xx 开头,这一种安全机制,如果以java开头,则直接异常 private ProtectionDomain preDefineClass(String name, ProtectionDomain protectionDomain) { if ...

    这里说一下为什么自定义的包不能以 java.xxx.xx 开头,这是一种安全机制,如果以java开头,则直接异常

     private ProtectionDomain preDefineClass(String name,
    					    ProtectionDomain protectionDomain)
        {
    	if (!checkName(name))
    	    throw new NoClassDefFoundError("IllegalName: " + name);
    
    	if ((name != null) && name.startsWith("java.")) {					 // 这里是防止恶意篡改系统中的类
    	    throw new SecurityException("Prohibited package name: " +
    					name.substring(0, name.lastIndexOf('.')));
    	}
    	if (protectionDomain == null) {
    	    protectionDomain = getDefaultDomain();
    	}
    
    	if (name != null)
    	    checkCerts(name, protectionDomain.getCodeSource());
    
    	return protectionDomain;
        }

    如果自己定义了一个 java.lang.String 类,然后执行此类中的方法会出现什么情况 ? 

    java.lang.NoSuchMethodError: main
    Exception in thread "main" 

    会发出上面的异常,为什么呢?

    因为Java的类加载机制造成的,类的加载机制为双亲委派模型,也就是先交给其父亲加载器去加载,如果父亲加载不到,那么再由自己加载

    我们自己定义的类一般都由AppClassLoader 进行加载,而它的父亲为ExtclassLoader,而 ExtClassloader的父亲则是 BoostrapClasslader,所以我们自定义的

    java.lang.String 最先由 BootStrapClassLoader 加载,而BootStrapLoader 加载器由C++写,它负责加载系统中的类库,而java.lang.string 正是系统中的类,已经被 

    BootStrapLoader 加载过了,所以不需要再加载 java.lang.String(虽然我们写的与系统中的不是一个,但名字是一样的),所以这样就会免去了加载而直接执行java.lang.String

    中的main方法,而系统中的java.lang.string 中没有main 方法,这也就出现了上面的异常


    展开全文
  • 如果一个变量以数字开头,那么分析器就必须在遇到第一个或第二个英文字符的时候回溯来确定是否数字、变量名还是词法错误,这时候就变成了二型文法。二型文法分析器的好处支持回溯和递归语法(所以语法分析靠它...

    ab65f8ad164d88a631eaf6d976c13741.png

    程序语言的分析分词法和语法两部分。词法分析主要用的是正规文法,也就是三型文法。这类文法主要采用正则表达式分析。正则文法分析器的特点是它是不回溯的,所以实现很简单。如果一个变量以数字开头,那么分析器就必须在遇到第一个或第二个英文字符的时候回溯来确定是否是数字、变量名还是词法错误,这时候就变成了二型文法。二型文法分析器的好处是支持回溯和递归语法(所以语法分析是靠它的),但是缺点是状态机相比正则文法状态大大增加,而且代码写起来更困难。考虑到词法分析部分只是用来断字,我们实在是没有为了支持变量名以数字开头这么一个小功能而让整个词法分析部分用二型文法写。

    故,最后大家都默认了变量要避免用数字开头。

    java变量命名规则

    环境变量通常是指在操作系统中,用来指定操作系统运行时需要的一些参数

    变量名以字母、下划线或者美元符(4上面的¥)开头,不能以数字开头,后面跟字母、下划线、美元符、数字,变量名对大小写敏感,无长度限制

    驼峰命名法:

    1.变量名应该用有意义的英文单词

    2.变量名如果只有一个单词,则所有的字母小写

    3.变量名如果由多个英文单词组成,则从第二个单词开始首字母大写

    4.在java中bool值用boolean表示,只有true和false两种,不能用0和非0,或空和非空表示,如下图,这里的意思是第三行出错,不能把int型变量赋值给boolean型变量

    5.java使用unicode字符码,意味着可以在java里面使用世界上的任意一种语言的字符集,用一个char类型变量可以存储一个汉字,即一个中文字符和英文字符所用的存储空间是一样的

    6.乱码的出现:用a字符集将汉字转换为编码,但系统用b字符集将编码转换为汉字时,将出现找不到编码,出现乱码

    展开全文
  • java 什么是方法Java方法语句的集合,它们在一起执行一个功能。方法解决一问题的步骤的有序组合,方法包含于或对象中,方法在程序中被创建,在其他地方被引用。方法的优点1. 使程序变得更简短而清晰。2. ...
  • 重温抽象的概念我们都知道在面向对象的领域一切都对象,同时所有的对象都通过来描述的,但是并不所有的来描述对象的。如果一个没有足够的信息来描述一个具体的对象,而需要其他具体的来支撑它,...
  • 初学JAVA我现在大一,学的软件工程专业。上学期c语言别人觉得的简单的时候我已经很吃力了,根本没接触过这东西。下学期学Java更蒙了,没办法该学还得学呀,只能一边上课一边找视频了,家里也没...什么是继承?与...
  • 本文首发于公众号:javaadu典型答案加载器属于JVM的加载子系统,常见的...Bootstrap classloaderC++编写的启动加载器,负责加载java.lang.*开头;ExtClassloader扩展加载器,负责加载JVM扩展,比...
  • 阅读本文大概需要3分钟。典型答案 首先,加载器属于JVM的加载子系统,常见的加载...Bootstrap classloaderC++编写的启动加载器,负责加载java.lang.*开头;ExtClassloader扩展加载器,负责加载JVM...
  • java中为什么变量名不能以数字开头

    千次阅读 2019-12-14 17:58:10
    什么变量名不能以数字开头? 我们可以假设变量名可以以数字开头,那么对于下图这两句来说应该对还是错? //明星 public class SuperStar { //姓名 private String name; //国籍 private String ...
  • JDK Atomic开头通过 CAS 原理解决并发情况下原子性问题CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被...
  • Java异常到底是什么

    2021-02-04 22:36:40
    Throwable类是Java中所有错误和异常的超类,位于java.lang包,从JDK1.0开始引入。Throwable有两个子类Exception(Java中所有异常类的父类)和Error(Java中所有错误类的父类)。 错误往往是程序运行时发生,程序员...
  • Throwable类是Java中所有错误和异常的超类,位于java.lang包,从JDK1.0开始引入。Throwable有两个子类Exception(Java中所有异常类的父类)和Error(Java中所有错误类的父类)。 错误往往是程序运行时发生,程序员...
  • Java AWT是什么?

    2009-03-25 21:22:00
    AWT是Java抽象窗口工具,通过这组你只需进行一次代码开发,就可以移植到许多平台。要使用AWT,在工程的开头使用import java.awt.*语句将其导入。这将允许你使用TextComponent组件,例如:Buttons、Scrollbars、...
  • 重温抽象的概念  我们都知道在面向对象的领域一切都对象,同时所有的... Animal(),我们都知道这个产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就
  • 1、标识符:在java语言中,标识符常用来给、...并且标识符不能以数字开头,标识符区别大小写的,没有长度限制,不能把java关键字作为标识符。例如:以下标识符合法的:name, my_name, _21, $money,以下标识...
  • Java虚拟机的角度来看,只存在两种不同的加载器:一种启动加载器,一种继承抽象类java.lang.ClassLoader的。 启动加载器(引导加载器)Bootstrap ClassLoader:     由C/C++...
  • 一、注释注释一共有三种://单行注释/*多行注释*//**文档注释*/注释的内容不会被编译那么什么是注释? 解释说明的文字注释的作用? 对代码的解释说明,便于后期维护注释的分类:单行注释作用域:只在当前行有效嵌套:可以...
  • Java方法01:什么是方法

    2020-05-12 14:54:15
    System.out.println(),那么它是什么呢 System out 对象 println() 方法 Java方法是语句的集合,它们在一起执行一个功能。 方法是解救一问题的步骤的有序组合 方法包含于或者对象中 方法在程序中被创建,...
  • 可以将一个类定义在另一个类或方法中,这样的类叫做内部类 --《Thinking in Java》 ...内部类是什么? 由文章开头可知,内部类的定义为:定义在另一个类或方法中的类。而根据使用场景的不同,内部类还可以分...
  • java 装载器原理

    2019-09-24 09:07:18
    问题引入:getClass().getClassLoader().get... getClassLoader():获得加载器,这里问题就来了什么是类加载器,其工作原理如何?  getResoure(path):path以"/"开头:获得当前加载器加载的所在包的路径...
  • 类和关键字在词法上区别:类是开头写,关键字小写开头 [修饰符列表] class 类名{ //成员变量 //成员方法 } 成员变量 [修饰符列表] 数据类型 属性名; 1.当变量写在类中,就变成了成员变量 2.成员变量是...
  • String类的开头定义如下:从上面可以看出,String类是final类,也就意味着String类是不能被继承的。1)String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰...
  • 抽象类什么是抽象类JAVA允许在类中只声明方法而不提供方法的实现。...抽象类是以abstract关键字为开头的类。 抽象方法在声明中也要加上 abstract 。abstract class Employee{ //抽象类:以abstract关键字为开头的类 a
  • 点击进入_更多_Java千百问1、注释是什么java中的注释和其他编程语言中的注释一样,注释的内容不会被编译运行,只是源代码中对代码的解释说明。 通过添加代码注释可以提高源代码的可读性,使得Java程序条理清晰,...
  • java 枚举理解

    2019-09-14 11:23:08
    开头照常,枚举的写法和定义不再复述,自行百度。 问:什么时候必须用枚举?...问:那枚举的作用是什么呢?最重要的作用是限制数据,保障数据是安全的。比如你可以用1,2代表男女,或者直接用男女字符串标识。可...
  • 在《深入理解java虚拟机》一书中有这样一段话,“即使自定义了自己的加载器,强行使用defineClass()方法去加载一个以‘java.lang’开头也不会成功,如果尝试这样做的话,将会收到一个由虚拟机自己抛出的‘java...
  • JAVA方法1--什么是方法

    2020-10-27 16:13:07
    什么是方法 System.out.println() .输出对象.方法 命名规则:小写开头,驼峰原则 方法语句的集合,他们在一起执行一个功能 方法解决一问题的步骤的有序组合 方法包含于对象中 方法在程序中被创建,在其他...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510
精华内容 204
关键字:

java类是什么开头

java 订阅