整理一下大二所做的手抄笔记1(反射机制及为什么要使用反射)

news/2024/5/19 6:59:24 标签: java, 反射, 动态加载, 原理

本来想就“大三笔记”这个专栏一直写下去的,后来想想,很多现在接触到的知识都是需要了解一下底层原理才能更好地掌握的,于是乎,鞭策鞭策自己,将自己大二期间作的手抄笔记慢慢都更新到csdn中,方便阅览,当然了,“大三笔记”也是会一直更的,期间也会更这个专栏。

 

什么是反射

 

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

class Office{

    public static void main(String []args){
        if(args[0].equals("word")){
            word w = new word();
            w.start();

}

  if(args[0].equals("excel")){
            excel e = new excel();
            e.start();

}

}

假如我们想要运行office类,那么我们是否一定要创建word和excel类? 如果我们不采用反射机制,那么答案就是肯定的,我们必须创建word和excel,但是呢,假如我们实际上只想调用word里面的start方法呢?

可能有小伙伴说,那我们便创建一个word类呗。

class word{
    public void start("word start..");
}
javac office.java
java office word

如上图所示,我们将"word"作为arg[0]传进去,然后运行office,可以运行吗? 不行,其实实际上编译都无法通过,因为会报classnotfoundexception,找不到excel。相信大家已经察觉到问题了吧?我明明只想调用word里面的方法,excel方法我暂时不想用,我的理想状态是我想用word的时候就只加载word,到我用excel的时候你再来报错。难道我就非要创建一个excel类吗? 那么假如我office类里面有多个方法呢? 那岂不是每次添加都要编译一次office? 

这里的关键点是:我们通过new出来的实例对象,是属于静态编译,在编译时就需要加载所有类中可能会用到的类,如果找不到类则报错,那如何解决? 没错,动态编译

请大家弄清一个概念:

编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。

下面我们来写一个能够动态加载类的office类。

class OfficeBetter{
public static void main(String []args){
    try{
//动态加载类,在运行时刻加载
           Class c = Class.forName(args[0]);
            word w = (word)c.newInstance();
               w.start();
        }
        catch(Exception e){...}

}}

这样写有问题吗? 有的,因为这样子虽然是动态加载了,可是你这跟excel没有关系了呀,万一我又突然想调用excel里面的方法呢?难道我要把c.newInstance()强转为excel,然后再编译? 别急,下面请看。

interfacce officeAble{
        public void start();
}
class OfficeBetter{
public static void main(String []args){
    try{
//动态加载类,在运行时刻加载
           Class c = Class.forName(args[0]);
            OfficeAble oa = (OfficeAble)c.newInstance();
               oa.start();
        }
        catch(Exception e){...}

}}

没错,相信大家也已经明白了---让word和excel实现officeable接口,这样你不管传的args[0]是word还是excel,或者是你以后想扩展一些类,你大可以新建一个任意类,只要它实现了officeable接口,你就可以在officeBetter中调用。


http://www.niftyadmin.cn/n/1239378.html

相关文章

eclipse java清屏代码_Java初学者这些IDE的优缺点你都知道吗?看哪一个适合你?...

如今的Java可是个很好的编程语言,不仅本身功能强大,而且还能够适应多平台开发,于是市场上各种关于Java的开发工具都纷纷冒出头。那么,身为Java初学者的你,它们的优缺点你都知道吗?本文就列举6款常用的IDE的…

大三笔记(nginx负载均衡介绍与ip_hash指令)

一、反向代理 正向代理: 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就是正向代理。正向代理的特点:就是我们明确知道要访问哪个网站地址。 反向代理: 客户端想获取服务器…

大三笔记(ssm项目中使用layui进行分页)

本篇文章较为简单&#xff0c;实现的功能是分页。下面贴代码。 <script src"layui.js" charset"utf-8"></script> <!-- 注意&#xff1a;如果你直接复制所有代码到本地&#xff0c;上述js路径需要改成你本地的 --> <script> layu…

darknet框架_手把手教你如何在darknet框架下配置yolo v3

手把手教你如何在darknet框架下配置yolo v3目录:什么是darknet如何配置darknet以及测试制作VOC数据集使用yolo v3训练自己的数据什么是darknet可以把darknet看成是一个框架&#xff0c;里面包含了从AlexNet到现在yolo的配置文件&#xff0c;都是基于C实现的&#xff0c;使用者可…

大三笔记(mvc:annotation-driven配置与中文乱码问题)

<mvc:annotation-driven/>: 这个类主要是用来向工厂中注册了 RequestMappingHandlerMapping BeanNameUrlHandlerMapping RequestMappingHandlerAdapter HttpRequestHandlerAdapter SimpleControllerHandlerAdapter ExceptionHandlerExceptionResolver Response…

chmod 赋权所有_chmod 权限 命令详细用法

指令名称 : chmod使用权限 : 所有使用者使用方式 : chmod [-cfvR] [--help] [--version] mode file...说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。参数 :mode : 权限设定字串&#xff0c;格式如下 : […

大三笔记(ajax传递json对象给controller,controller封装为java对象后存入数据库)

首先来看一个注解 RequestBody 1、requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容&#xff0c;比如说&#xff1a;application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。 2、 通过reques…

去除logo 高德地图api_深圳品牌logo升级如何保持原型的同时更具创新?

今年有很多知名企业都启用更新了logo&#xff0c;像宝马、长安、腾讯地图、高德地图、中国联通等&#xff0c;都相应的更新了logo。之前的文章我们也有说过为什么要对logo进行升级&#xff0c;品牌业务变化&#xff0c;战略改革&#xff0c;视觉也需要跟随变化优化&#xff1b;…