前言

上一节我们讨论过通过关键字synchronized实现线程同步,同时最主要了解到在Java中className.class所代表的具体含义,在博客写完后,感觉还是有点迷糊,然后再次深入了解后,原来关于className.class在Java语言规范中定义为(Class Literal),我们翻译为类文字好像比较生硬,还是以英文作为说明最好,本节我们再来详细讨论下Class Literal。

Class Literal

在java语言规范中有对Class Literals的定义《https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2》:它是由类,接口,数组或原始类型的名称或伪类型void组成的表达式,后面紧跟【.】和【class】。比如C.class,那么它的类型则为Class ,其中C是类,接口或数组类型的名称。比如p.class的类型(其中p是基本类型的名称)是Class ,其中B是装箱转换后的类型p的表达式的类型,也就说例如int.class,它的Class Literal实际上是Class。而void.class,它的Class Literal是Class。最后对于类型的变量当然也就没有Class Literal。比如我们要想获取包装类Integer的Class Literal,可以通过如下两种方式来获取:

System.out.println(Class.forName("java.lang.Integer"));

System.out.println(Integer.class);

接下来我们通过定义一个类来更加深入了解,如下:

classTest {

}

我们再来通过上述方法获取其Class Literal,此时forName中参数则是类所在包空间,如下:

Class cls = Class.forName("com.company.Test");

System.out.println(cls.toString());

System.out.println(Test.class);

还记得上一节我们重点讲解的就是通过关键字synchronized,在其方法或同步块中的监视器或锁定对象是className.class即Class Literal,我们也知道在类加载时机的第一阶段中的第三件事情则是在JVM中生成对于对应类且只存在一次的java.lang.class的对象,该对象包含有关该类的元数据等等,也就是说该锁定对象就是对该类生成的java.lang.class对象的引用。例如,如下例子:

classTest {public voidlockMethod1() {synchronized (Test.class) {

System.out.println("1");

}

}public voidlockMethod2() {synchronized (Test.class) {

System.out.println("2");

}

}

}

当发生并发分别执行如上方法一和方法二,若此时执行到方法二时,但是方法一并未执行完成,通过上述对锁定对象的详细分析,此时必将导致方法二会被阻塞,直到方法一执行完毕,释放线程同步锁。到此我们讲解了Class Literal在线程同步中的使用,其实在反射中使用的机会也比较多,比如创建命令行将程序进行重启的命令,我们通过ProcessImpl类中的createCommandLine方法,创建命令行,这里我们尝试使用反射来实现,C#中通过反射调用方法,其参数是Object数组(记得是这样),在java中通过反射调用方法,其参数就是ClassLiteral泛型数组,所以我们必须显式指定参数类型,这就应用到了Class Literal,如下:

public static void main(String[] args) throwsInvocationTargetException,

IllegalAccessException,

NoSuchMethodException,

ClassNotFoundException {final String[] cmd ={"shutdown.exe","/r","/t 0",

};final String executablePath = new File(cmd[0]).getPath();final Class> impl = ClassLoader.getSystemClassLoader().loadClass("java.lang.ProcessImpl");final Method myMethod =impl.getDeclaredMethod("createCommandLine",new Class[] {

int.class,

String.class,

String[].class});

myMethod.setAccessible(true);final Object result =myMethod.invoke(null,2,

executablePath,

cmd);

System.out.println(result);

}

总结

本节我们再一次深入并了解className.class,在java语言规范中其专有名词为Class Literal,并对其在线程同步中的使用以及为何就保证了线程安全又进行了啰嗦式的分析,最后也通过一个反射例子作为Class Literal的使用练习而结束本文,至此关于Class Literal的学习算告一段落。下一节我们进入学习Hibernate。

java @literal_Class Literal(Java)相关推荐

  1. JAVA泛型知识(一)

    Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目        录 ...

  2. Java核心类库(上)

    Java核心类库(上) 参加拉勾教育大数据训练营课程笔记 学会查阅API文档,根据包索引,搜索等. 常用类 java.lang - 唯一一个Java虚拟机自动访问,所以System等不需要import ...

  3. Java知多少(29)覆盖和重载

    在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...

  4. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  5. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  6. Java知多少(中)

    Java知多少(上) Java知多少(39)interface接口 Java知多少(40)接口和抽象类的区别 Java知多少(41)泛型详解 Java知多少(42)泛型通配符和类型参数的范围 Java ...

  7. java基础学习(1)-jre与jdk

    1.jre:java runtime environment (java运行时环境)的缩写,它包含jvm和java的核心类库 2.jdk:Java Development Kitava开发工具包,它包 ...

  8. Java基础-异常(Exception)处理

    Java基础-异常(Exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常的概述 什么是异常?Java代码在运行时期发生的问题就是异常.在Java中,把异 ...

  9. JAVA就业指导(转)

    版权声明:转载文章  原地址-> http://blog.csdn.net/jackfrued/article/details/45035097 (很不错的文章 转载一发) Java就业指导   ...

最新文章

  1. 【Qt】Qt再学习(十五):关于paintEvent、QPainter学习这一个demo就够了
  2. C++--在单文档的应用程序增加多个视图
  3. python商品评论分析_亚马逊产品情感评论分析
  4. 如何使用工具对SAP CRM系统的odata服务进行监控
  5. 华为耳机5根线怎么接线图解_联通宽带突然无法上网怎么急救处理?
  6. 线性系统的频率响应分析实验报告_动态系统的建模与分析
  7. excel未完全加载怎么办_你知道如何改变Excel的打开姿势吗?
  8. 法学学士学位的完整形式是什么?
  9. 【repost】Javascript操作DOM常用API总结
  10. JS设计模式——10.门面模式
  11. php mysql完全学习手册 下载_PHP+MySQL完全学习手册
  12. stm8s电机库vtimer_SetTimer()函数的使用
  13. 电脑打开应用程序提示配置系统未能初始化--解决方案
  14. 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。 这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?2.角谷定理。
  15. 涉密计算机违规外联检查,涉密计算机违规外联及移动存储介质使用检查的研究与实现...
  16. 在Word中嵌入Mathtype公式编辑器
  17. 关于handler子线程通知主线程的几种写法
  18. 【CAN】 PCAN Explorer5 常用操作使用简介
  19. 僵尸网络检测和抑制方法
  20. 塑料周转箱提高贮存效率

热门文章

  1. 前端面试题 回顾与复习(更新中)
  2. 编程中的api指什么?是什么意思?
  3. 关于hadoop下namenode格式化多次的解决方案
  4. OpenCV:qt.qpa.plugin: Could not load the Qt platform plugin “xcb”
  5. springboot + mybatis
  6. Python 企业微信群推送消息
  7. TCP的CLOSING状态发生条件
  8. 开启mysql日志_mysql启动日志在哪
  9. Python uWSGI部署服务
  10. ANSYS静力学分析实例入门一