类型信息

1、java主要有两种方式在运行时识别对象和类的信息:RTTI和“反射”机制。
2、类加载器系统实际上可以包含一条类加载器链,但是只有一个原生态加载器,它是JVM实现的一部分。原生态加载器加载的是所谓的可信类,包括Java API,它们通常都是从本地盘加载的。在这条链中,通常不需要添加额外的类加载器,但是如果你有需求,那么你有一种方式可以挂载额外的类加载器。
3、所有的类都是在对其第一次使用时,动态加载到JVM中。java程序再它开始运行之前并非完全加载,其各个部分是在必需时才加载。
4、使用Class.forName()加载类时,必需使用全限定名(包括包名)。
5、java还提供了“类字面常量”来获得Class对象的引用。即类A获取Class引用的方法为A.class。这样做不仅简单,安全(因为在编译期是就会检查),而且比forName的方法高效。对于基本类型的包装类,还有一个标准字段TYPE指向Class对象的引用。boolean.class等价于Boolean.TYPE。
6、 为了使用类而做的准备有三个步骤:

  • 加载:由类加载器进行,该步骤将查找字节码,并从字节码中创建Class对象引用。
  • 链接:验证类中的字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。
  • 初始化:如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
public class Initable {static final int staticFinal = 47;static final int staticFinal2 = new Random().nextInt(100);static {System.out.println("Initable");}
}public class Initable2 {static int staticNonFinal = 74;static{System.out.println("Initable2");}
}
public class Initable3 {static int staticNonFinal = 174;static{System.out.println("Initable3");}
}
public class ClassInitialization {public static void main(String[] args) throws Exception{Class initable = Initable.class;System.out.println("After creating Initable ref");System.out.println(Initable.staticFinal);System.out.println(Initable.staticFinal2);System.out.println(Initable2.staticNonFinal);Class initable3 = Class.forName("com.yanguang.Initable3");System.out.println("After creating Initable3 ref");System.out.println(Initable3.staticNonFinal);}
}
/* Output
After creating Initable ref
47
Initable
15
Initable2
74
Initable3
After creating Initable3 ref
174
*/
  • 初始化有效地实现了尽可能的“惰性”。仅使用.class不会触发类的初始化。而调用Class.forName会导致类初始化。(比如Initable.class和Class.forName("com.yanguang.Initable3"))
  • 如果一个类的变量是static final的
    • 这个变量的值是编译器常量:这个值可以在类不被初始化时就可以读取。(Initable.staticFinal)
    • 这个变量的值动态获得(比如通过随机函数生成),那么对这个值得调用会导致类的初始化。(Initable.staticFinal2)
  • 如果一个static域不是final的,那么在访问它时,总是要求在它被读取前,先进行链接(分配空间)和初始化(初始化该空间)。(Initable2.staticNonFinal)

7、泛化的Class引用。向Class引用添加泛型语法的原因仅仅是为了提供编译期类型检查。

Class intClass = int.class;
intClass = double.class; //编译通过
Class<Integer> genericIntClass = int.class;
// genericIntClass = double.class; // 编译报错。

有时为了放松校验的范围,可以使用泛型的特性? extends

// Class<Number> genericNumberClass = int.class; 
Class<? extends Number> bounded = int.class;
bounded = double.class;

因为Integer Class对象不是Number Class对象的子类。
8、instanceof 和isInstance()生成的结果完全一样,equals()和==也一样。另外,instanceof保持了类型的概念,它指的是“你是这个类吗?或者你是这个类的派生类吗?”而如果用==将会比较实际的Class对象,就没考虑继承-它或者是这个确切的类型,或者不是。
9、当通过反射与一个未知类型的对象打交道时,JVM只是简单地检查这个对象,看它属于哪个特定的类(就像RTTI那样)。在真正调用它之前,必须先加载它的Class对象。因此,它的class文件对于JVM来说,必须是可以获取的,要么是在本地机器,要么是在网络上。所以RTTI和反射之间真正的区别只在于,对于RTTI来说,编译器在编译时打开和检查.class文件。而对于反射来说,.class文件在编译时是不可获取的,所以是在运行时打开和检查.class文件。
10、代理是基本的设计模式之一,它是你为了提供额外的操作或不同的操作,而插入的用来代替实际对象的对象。Java的动态代理可以动态地创建代理并动态地处理对所调方法的调用。

  • 动态代理得实现InvocationHandler接口,其中有invoke方法,参数分别为代理对象,方法,参数。
  • invoke()方法中传递进来代理对象,以防你需要区分请求的资源。
  • 通常,会用Proxy.newProxyInstance(Interface.class.getClassLoader(),new Class[]{Interface.class}, new DynamicProxyHandler(realObject))的方法生成代理类,并用被代理对象的接口指向代理类,然后在方法中用Method.invoke()将请求转发给被代理对象,并传入必须的参数。

11、使用interface关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合度。但是有了instanceof之后,你就能知道接口引用所指向的具体对象,从而向下转型,这就会使得代码和具体对象的耦合提高,这是我们所不希望看到的。对于这种情况,最简单的方式是对接口的实现类使用包访问权限,这样在包外部的客户端就不能看到它们了。

class C implements A{
}
public class HiddenC{
pubic static A makeA(){return new C();}
}
  • 但是通过反射,你仍旧可以到达并调用所有方法,即使是private方法。
static void callHiddenMethod(Object a, String methodName) throws Exception{
Method g = a.getClass().getDeclaredMethod(method);
g.setAccessible(true);
g.invoke(a);
}

转载于:https://www.cnblogs.com/kejicjk/p/7039904.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

primefaces_懒惰的JSF Primefaces数据表分页–第1部分

primefaces今天&#xff0c;我们将使用带有视图范围的托管bean的惰性列表进行JSF数据表分页。 这些单词/表达是什么意思&#xff1f; 如今&#xff0c;有几个JSF框架可为数据表提供现成的分页&#xff0c;列排序器和其他功能。 今天&#xff0c;我们将使用Primefaces数据表。 …

linux下python开发环境搭建_linux下python开发环境之二——安装Eclipse+PyDev

Eclipse是由java开发的&#xff0c;所以要想让Eclipse跑起来就得安装jdk&#xff0c;在命令行里输入javac就能查看本机是否已经安装好了jdk了。1、安装jdk先从oracle官网上下载jdk&#xff0c;放到/usr/local/src/文件中&#xff0c;由于找不到linux的下载连接&#xff0c;所以…

台式计算机如何连接vif,关于计算机二级( VIF ) 县城有高手吗? 急寻

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼自考《管理系统中计算机应用》上机实践考试样卷2007年08月09日 13:29(本卷考试时间60分钟)注意事项&#xff1a;1、在考核盘的根目录下有XS.DBF、CJ.DBF、STD.DBF、LOAN.DBF、DISREC.SCX、TTT.PRG、KSH.PRG和KSHF.SCX文件&#xff…

Eclipse新建java类的时候,自动创建注释

为形成个人的java代码风格,我们在项目组中进行开发的时候&#xff0c;可以对自己的代码进行一些格式上面的设置&#xff0c;具体如下&#xff1a; 方法一&#xff1a;Eclipse中设置在创建新类时自动生成注释 windows–>preference Java–>Code Style–>Code Templates…

无论是否使用Spring Framework,为什么我们会失败?

在Twitter领域再次引起了一些反感 &#xff0c;我看到了Sam Atkinson的博客帖子&#xff0c;题为“ 为什么我讨厌Spring” 。 这篇博客文章的撰写早于2014年&#xff0c;但是DZone后来才真正选择并发布了它。 实际上&#xff0c;在撰写本文时&#xff0c;Atkinson是一名开发人员…

endnote能自动翻译吗_自动挡和手自一体有啥区别?从外表能看出一辆车是哪种变速箱吗?...

汽车分自动挡和手动挡&#xff0c;手动挡就是一个手动变速箱&#xff0c;很好理解。但自动挡变速箱有很多种&#xff0c;前几日有人问了这么几个问题&#xff0c;没来得及回复&#xff0c;现在超时不能单独回复了&#xff0c;在此详细说一下&#xff0c;因为这是一个非常基础且…

html5平板电脑,Html5添加支持桌面、移动触摸手机和平板电脑的Lightbox插件教程

一、使用方法首先在标签之前或标签中引入jquery和swipebox js文件。在标签中引入swipebox.css文件。二、Html结构三、调用插件;( function( $ ) {$( .swipebox ).swipebox();} )( jQuery );四、高级配置(1)画廊(2)视频支持My Videos(3)动态调用画廊$( #gallery ).click( functi…

idea 内存溢出解决方法

在Run/Debug configuration 的 vm options里面输入 -server -XX:PermSize128M -XX:MaxPermSize256m 具体如下图&#xff1a; 转载于:https://www.cnblogs.com/Liang-Haishan216/p/7044028.html

网页设计html加音频,HTML5网页中如何嵌入音频,视频?

《HTML5的视频播放控制技术》 介绍了本文主要介绍在HTML5 中如何嵌入音频&#xff0c;视频&#xff1f;在HTML5 中如何嵌入音频&#xff1f;HTML5 支持 MP3、Wav 和 Ogg 格式的音频&#xff0c;代码示例&#xff1a;Your browser does’nt support audio embedding feature.HTM…

seo 伪原创_胡子哥谈seo优化:那些不被了解的伪原创技巧

各位小伙伴们好&#xff0c;我是没有胡子的胡子哥&#xff0c;玩转SEO多年的老互联网人。(胡子哥推出包上首页服务&#xff0c;无效退款&#xff0c;有技术就是敢承诺&#xff01;)做SEO优化的人都知道&#xff0c;一个网站提升权重的过程中&#xff0c;文章的原创度占比是很高…

javafx2_JavaFX 2 GameTutorial第3部分

javafx2介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程。 如果您错过了第1部分和第2部分 &#xff0c;我建议您在开始本教程之前仔细阅读它们。 回顾第2部分&#xff0c;我讨论了游戏循环的内部工作原理&#xff0c;其中我们使用动画&#xff08;JavaFX Time…

03_字体标记

12321321转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7044136.html

dw中html中无法使用js,在Dreamweaver中调用JavaScript行为

调用JavaScript行为可以指定在事件发生时要执行的自定义函数或者JavaScript代码。可以自己书写这些JavaScript代码&#xff0c;也可以使用网络上免费发布的各种JavaScript库。一、Dreamweaver调用JavaScript行为1. 选择一个对象。2. 打开行为面板。3. 点击“添加行为()”按钮&a…

python 渗透框架_Python渗透测试框架:PytheM

PytheM是一个Python渗透测试框架。它只能在osnGNU/Linux OS系统上运行。安装$sudo apt-get update$sudo apt-get install libasound-dev libjack-jackd2-dev portaudio19-dev python-pyaudio build-essential python-dev libnetfilter-queue-dev libespeak1 libffi-dev libssl-…

javaweb可部署目录结构

webApp //项目名称 -META-INF --MANIFEST.MF -WEB-INF --classes //编译class文件 --lib //依赖jar --web.xml -index.jsp //首页转载于:https://www.cnblogs.com/chenweichu/p/7044925.html

带有JBoss工具的OpenShift 3上的Java EE 7应用程序

您可以使用最新版本的JBoss Tools OpenShift插件在Eclipse中创建和管理OpenShift应用程序。 他们要么预先捆绑了最新的 JBoss Developer Studio&#xff08;9.0.0.GA&#xff09; &#xff0c;也可以将它们安装到现有的Eclipse Mars中。 这篇文章将引导您通过JBoss Developer …

上海交大计算机学院奖学金,上海交通大学-电子信息与电气工程学院-学生工作办公室...

各位同学&#xff1a;由于中船奖学金申请人数不够&#xff0c;故申报截止时间推迟到3月23日17&#xff1a;00。公示时间推迟到3月26日-3月28日17&#xff1a;00。请仍想申请本奖学金的同学于3月23日17&#xff1a;00前将材料交至指定地点&#xff0c;特此通知。电院学生办2018年…

自动检测技术学习心得体会_国培计划(2020)—学校管理团队信息化领导力提升培训心得体会...

点击蓝字关注我吧国培计划(2020)—学校管理团队信息化领导力提升培训心得体会2020年10月28日&#xff0c;由裕安区教师进修学校承担的2020年“国培计划(2020)- 学校管理者信息化领导力培训项目在全体学员的期待下正式拉开序幕。精心设计的培训课程精彩纷呈的课堂培训的内容和我…

重装mysql出现无法start service的问题

could not start the service MySQL .error 0 安装时无法启动服务 在MySQL数据库卸载后重装时&#xff0c;一定要将MySQL的相关服务&#xff0c;文件夹&#xff0c;注册表删除彻底 重装前的步骤&#xff1a; 1.打开service.msc关闭MySQL服务 2.控制面板 -> 程序和功能 -…

安宁计算机学院,滁州学院张燕咏、安宁两位教授应邀来我院指导工作

应计算机与信息工程学院邀请&#xff0c;美国罗格斯大学张燕咏教授、合肥工业大学安宁教授于6月9、10日两天来我院进行学术交流和实验室建设方案讨论。6月9日上午&#xff0c;信息学院刘进军、姚光顺两位教师向两位教授汇报了信息学院的实验室建设思路、特别是物联网专业实验室…