`
miaoge
  • 浏览: 107924 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类

SeventhDay--Java基础(五)反射、内部类

阅读更多

反射:
 反射:在运行时动态分析或使用一个类进行工作。
 java.lang.Class类:描述类信息的类。
 类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。
 
 获得类对象的方式:
  用" 类名.class "获得这个类的类对象。
  用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。
  可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。
  基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。

 java.lang.reflect包下的三个重要类:
  Field属性类:用来描述属性的信息。
  Method方法类:方法的信息的描述。
  Constructor构造方法类:用来描述构造方法的信息。

 Class类中的常用方法:
  newInstance()
   创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。
  getDeclaredMethods()
   获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。
  getMethods()     //推荐使用
   获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。
  getDeclaredConstructors()
   获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。
  getConstructors()    //推荐使用
   获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。
  getDeclaredFields()    //推荐使用
   获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。
  getFields()
   获得的是一个Field属性类对象的数组,获得所有publice的属性对象。
   
 使用反射构造一个类的对象的步骤:
  a. 获得类对象
  b. 获得构造方法对象
  c. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,可以跳过第二步,直接使用" 类对象.newInstance() "方法来获得这个类的对象
  d. 获得方法对象
  e. 用方法对象调用方法(用这个类的对象作为第一参数)
  如下面的例子:
   反射机制的实现类:
    package day07.reflect;    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;   
    public class TestReflect {     
     public static Object get(String className , Map<String,Object> map) throws Exception{
      Class c = Class.forName(className);                  //获得类对象
      Object o = c.newInstance();                   //获得对象
      Set<String> set = map.keySet();
      for(String str : set){
       String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);
       Field f = c.getDeclaredField(str);
       Method m = c.getMethod(s, f.getType());        //获得方法对象
       m.invoke(o, map.get(str));                       //用方法对象调用方法
      }
      return o;
     }
     
     public static void main(String[] args) throws Exception { 
      Map m = new HashMap();
      m.put("name", "zhang");
      m.put("age", 22);
      Object o = get("day07.reflect.Student",m);
      Student s = (Student) o;
      System.out.println(s.getName() + "   " + s.getAge());
      
      Map m1 = new HashMap();
      m1.put("name", "li");
      m1.put("gender", "男");
      Object o1 = get("day07.reflect.Teacher",m1);
      Teacher t = (Teacher) o1;
      System.out.println(t.getName() + "    " + t.getGender());
     }
    }
   学生类:
    package day07.reflect;    
    public class Student {
     private String name;    
     private int age;    
     public int getAge() {
      return age;
     }    
     public void setAge(int age) {
      this.age = age;
     }    
     public String getName() {
      return name;
     }    
     public void setName(String name) {
      this.name = name;
     }
    } 
   教师类:
    package day07.reflect;    
    public class Teacher {
     private String name;    
     private String gender;    
     public String getGender() {
      return gender;
     }    
     public void setGender(String gender) {
      this.gender = gender;
     }      
     public String getName() {
      return name;
     }    
     public void setName(String name) {
      this.name = name;
     }    
    }
 
内部类:
 定义:
  定义在另外一个类中的类,就是内部类。
  编译后生成的两个独立的类:Outer.class 和Outer$Inner.class。
  
 内部类的分类:
  静态内部类:静态内部类定义在类中,任何方法外,用static修饰
   静态内部类只能访问外部类的静态成员。
   在外部类的外部,要创建一个静态内部类对象不需要外部类对象:
    Outer.Inner in = new Outer.Inner();
   在本类内部生成内部类对象的方式:
    Inner in = new Inner(); 
 
  成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列
   在内部类中可以直接访问外部类的私有属性。
   内部类和外部类的实例变量允许命名冲突。
    在内部类中访问实例变量:this.属性
    在内部类访问外部类的实例变量:外部类名.this.属性
   在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
    Outer out = new Outer();
    Outer.Inner in = out.new Inner();
   在本类内部生成内部类对象的方式:
    在静态方法中:Inner in = new Outer().new Inner();
    在非静态方法中:Inner in = this.new Inner();
   成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
    
  局部内部类:在外部类的方法中定义的内部类
   与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
   局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
   配合接口使用,来做到强制弱耦合。
   在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
    Inner in = new Inner();
   
  匿名内部类:一种特殊的局部内部类
   没有名字,也没有class、extends、implements关键字
   用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。
   实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }
    例如:
     TreesSet ts = new TreeSet(new Comparator(){
      public int compare(Object o1, Object o2){
       return 0;
      }
     });
   匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
   匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。

分享到:
评论

相关推荐

    电影票房.csv

    电影票房

    ASP.NET技术在网站开发设计中的研究与开发(论文+源代码+开题报告)【ASP】.zip

    ASP.NET技术在网站开发设计中的研究与开发(论文+源代码+开题报告)【ASP】

    WebShell-Password.txt

    WebShell-Password

    基于 Unet++ 对自动驾驶车道线分割实战【包含数据集、完整代码、训练好的结果】

    基于 UnetPlusPlus 网络自动驾驶车道线分割实战 代码均为手写,全网无重复,训练自己数据很简单,只需要摆放好数据即可,具体参考README文件,小白均可使用 代码详细介绍:https://blog.csdn.net/qq_44886601/article/details/138858574 数据集:自动驾驶车道线分割(2类别,约3200张数据和标注图像) 网络仅仅测试30个epoch,全局像素点的准确度达到0.995,精确度为0.907,召回率为0.908,dice为0.91,训练epoch加大的话,性能还会更加优越! 代码介绍: 训练过程提供了多种优化器选择(Adam、SGD、RMSProp),损失函数采用BCE 逻辑损失,学习率的衰减提供了常规恒定lr、余弦退火算法、以及step学习率衰减。可以自行选择 【训练过程会生成最好和最后一个权重,以及数据预处理完的可视化效果图、dice、loss曲线、训练日志等等】

    asp.net某公司员工管理系统的设计与实现(源代码+论文)【ASP】.zip

    asp.net某公司员工管理系统的设计与实现(源代码+论文)【ASP】

    grpcio-1.16.0-cp36-cp36m-macosx_10_7_intel.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    grpcio-1.20.0-cp34-cp34m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于Java的个人理财管理系统(源码+论文+需求分析+数据库文件+演示视频).zip

    随着社会的发展,人们的生活水平的不断提高,人们在理财投资方面,已经有着很高的认识度了。人们的管理生活已经离不开网络。未来社会人们的生活和管理将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。 本设计尝试用JSP在网络上架构一个投资理财管理系统,本文从理论和实践两个角度出发,对一个具有数据挖掘功能投资理财管理系统进行设计与实现分析。论文首先较为详尽地介绍了管理课程的有关概念与知识,特别介绍了相关延伸表现形式,本统系统是运用JSP技术来实现的。其主要功能有:系统用户管理,收入记录, 支出记录,财产查询,还贷助手,储蓄提醒等。论文在撰写过程中,力求将理论与实践应用相结合,对各种理论进行阐述的同时配合系统从实际应用和操作技巧上加以说明,希望能够更充分地体现到这些知识与技术在本系统中的应用与实现。

    毕设新项目-基于图像处理的喷码缺陷检测python源码+详细项目说明+模型+数据集.zip

    毕设新项目-基于图像处理的喷码缺陷检测python源码+详细项目说明+模型+数据集.zip 【项目介绍】 瑕疵 在喷码位置确定一视野范围,以正常喷码样品视野内黑色面积为标准 * 漏喷 黑色覆盖面积小于正常喷码 * 喷码偏移 喷码超视野范围,视野内覆盖面积达不到标准要求 * 喷码模糊 * 字符缺失 采用OCR(光学字符识别技术)对喷码内容进行提取,和预定字符进行对比 * 打花 基于目标检测方案(找到每一个字符的位置及其所属类别,然后判断字符是否存在缺陷) (1)两阶段算法——基于候选区域 R-CNN,Faster R-CNN,先利用某些候选区域方法产生目标候选框,再判断候选框是否包含要检测的目标(检测效果好,尤其在小目标检测方面,但是速度相比一阶算法慢很多) 更多见项目说明!!! 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。

    在准备618节日相关的IT资源的建议

    在准备618节日相关的IT资源的建议

    ASP+ACCESS订单管理系统设计(论文+源代码+任务书)【ASP】.zip

    ASP+ACCESS订单管理系统设计(论文+源代码+任务书)【ASP】

    asp+ACCESS酒店房间预约系统设计(源代码+论文)【ASP】.zip

    asp+ACCESS酒店房间预约系统设计(源代码+论文)【ASP】

    ASP.NET某店积分更新记录管理(源代码+论文)【ASP】.zip

    ASP.NET某店积分更新记录管理(源代码+论文)【ASP】

    静态链接器 vs. 动态链接器:选择合适的链接方式"

    链接器 二、链接器主要任务: GNU ld(链接器)是用于将多个目标文件(包括目标文件、共享库、目标文件的归档文件等)合并成一个可执行文件或共享库的重要工具。它的主要功能包括:符号解析和重定位:链接器识别并解析输入文件中的符号引用,然后执行重定位操作以确保这些引用指向正确的地址。这包括将模块中的符号引用与其定义进行匹配,以便在合并时连接它们。 合并输入文件:链接器将多个输入文件中的代码段、数据段等模块合并成一个单一的地址空间。这包括将不同模块中的代码和数据安排到正确的内存地址中。 生成输出文件:链接器将合并的模块和符号表等信息写入输出文件中,该输出文件可以是可执行文件、共享库、目标文件等,具体类型取决于链接器的参数和配置。 符号表处理:链接器生成输出文件的符号表,其中包含了可供调试和动态链接器使用的符号信息。 处理重定位信息:如果存在重定位信息,链接器将生成重定位表,用于在加载时修正代码和数据的地址。这使得程序可以在不同的内存地址上运行。 处理链接器脚本:链接器可以根据链接器脚本(linker script)中的规则和指令来组织和排列模块,以满足特定需求。链接器脚本可以

    操作系统实验三银行家算法.docx

    操作系统实验三银行家算法

    基于ASP网络办公OA系统设计(论文+源代码+开题报告+答辩PPT)【ASP】.zip

    基于ASP网络办公OA系统设计(论文+源代码+开题报告+答辩PPT)【ASP】

    基于Java的工会会员管理系统(源码+论文+需求分析+数据库文件+演示视频).zip

    计算机对工会会员信息进行管理,具有人工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性强、存储量大、保密性能好等。这些优点能够极大地提高工会会员管理的工作质量和效率,也是工会管理的科学化、规范化、信息化管理的重要条件。另外随着计算机网络的持续发展,无论是工作、学习还是生活,将会越来越多地融入到流动的比特中,人们的工作节奏在不断加快,需要快捷的信息来源,并对此做出快速反应。 ; 二级工会会员管理系统 开发环境:MyEclipse,SQL Server 2005数据库,Tomcat6.0,Struts2+Spring+Hibernate技术整合。 实现的功能模块: 登录模块 部门信息管理模块 会员信息管理模块 报表信息管理模块 登录 注册 查看详细信息 修改 删除信息

    基于python的模板数字识别程序

    基于python的模板数字识别程序

    cryptography-37.0.0-cp36-abi3-win32.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    密码学之AES加密算法代码

    AES加解密实现代码

Global site tag (gtag.js) - Google Analytics