`
miaoge
  • 浏览: 107586 次
  • 性别: 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;
      }
     });
   匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
   匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。

分享到:
评论

相关推荐

    基于matlab实现的空间调制通信过程,包含信号调制、天线选择等发送过程,以及采用最大似然估计的检测过程 .rar

    基于matlab实现的空间调制通信过程,包含信号调制、天线选择等发送过程,以及采用最大似然估计的检测过程。.rar

    基于matlab的关于生猪养殖场经营管理的研究.docx

    本文档是课题研究的研究报告内含调研以及源码设计以及结果分析

    网络作为特征提取器-python源码.zip

    网络作为特征提取器-python源码.zip

    JavaScript-javaweb项目

    JavaScript-javaweb项目

    node-v12.11.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    仿Slideby触屏版html5响应式手机wap网站模板下载.zip

    触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板

    node-v10.18.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    IEC 60695-11-3:2012.pdf

    IEC 60695-11-3:2012.pdf

    2021-2010上市公司和讯网社会责任评级CSR-股东员工客户消费者环境社会责任分项评级

    上市公司和讯网社会责任评级CSR-股东责任员工责任客户消费者环境社会责任分项评级 得分(2010-2021年) "中国上市公司-和讯网社会责任数据"是 一份来自和讯网的数据集,它同步并收集了中国上市公司关于社会责任的相关信息。包括了 公司在股东责任、员工责任、供应商客户消费者权益责任、环境责任、社会责任中的表现和 成绩,以反映公司承担社会责任的程度。可以帮助大家了解公司在承担社会责任方面的具体 表现。这对于研究公司社会责任与公司业绩、公司声誉、公司风险等方面的关系具有参考意 义。 一、数据介绍 数据名称:上市公司和讯网社会责任评级CSR-股东责任员工责任 客户消费者环境社会责任分项评级得分 数据年份:2010-2021年 样本数量:每 年含2300-4600左右上市公司数据,总数据量40058条(注:因披露口径原因 ,2021年仅有430+上市公司数据) 数据格式:Excel面板数据 二、指标说 明 共计11个指标:股票名称、股票代码、年份、总得分、等级、股东责任、员工责任、 供应商客户和消费者权益责任、环境责任、社会责任、统计日期 三、部分excel数据 展示

    使用opencv进行人脸识别和对比-python源码.zip

    使用opencv进行人脸识别和对比-python源码.zip

    EmotionVGGnet情绪识别-python源码.zip

    EmotionVGGnet情绪识别-python源码.zip

    node-v12.1.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    MediaPipe人体姿势估计-python源码.zip

    MediaPipe人体姿势估计-python源码.zip

    构造并使用决策树进行分类-python源码.zip

    构造并使用决策树进行分类-python源码.zip

    <2024年5月软考高项极限冲刺>《1 考试简介》

    <2024年5月软考高项极限冲刺>《1 考试简介》

    【特效超多】仿德国开元旅游触屏版html5手机wap旅游网站模板下载.zip

    【特效超多】仿德国开元旅游触屏版html5手机wap旅游网站模板下载.zip

    JSP基于WEB网上论坛设计与实现(源代码+论文+开题报告+答辩PPT+外文翻译).zip

    JSP基于WEB网上论坛设计与实现(源代码+论文+开题报告+答辩PPT+外文翻译)

    仿YOKA服饰美容3G手机wap女性网站模板.zip

    触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板

    node-v12.0.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.4.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics