美文网首页
java基础3

java基础3

作者: 一只小星_ | 来源:发表于2019-03-08 16:58 被阅读0次
  • 1、说说对Class类的理解
  • 2、说说Class/Java动态加载类
  • 3、通过反射获取类的方法、变量等
  • 4、方法的反射

1.说说对Class类的理解

我们都是知道java是面向对象的,但是呢,java中有两种不是面向对象的存在,一种是基本数据类型int a=5;所以基本数据类型都提供了包装类型,还有一种就是静态成员。
那么,我们写的类是对象吗。我们写的每一个类也是对象,是java.lang.Class的对象,比如我们写了一个Student类,他本身就是Class类的实例对象。
看下Class类的源码就知道,他的构造方法是private,只有jvm去创建Class类的实例对象。
所以,任何一个类都是Class的实例对象,这个实例对象有三种表示方法:

第一种,类名.class
这实际上是说,任何一个类都有一个隐含的静态成员变量class
Class class1=Student.class;

第二种,用类对象去获取
student是用Student new出来的
Class class2=student.getClass();
在官网上的说法是,class1和class2表示的是Student的类类型。
这句话要怎么理解:类也是对象,是Class类的实例对象,这个对象(我们的类)称为Class的类类型。
第三种
Class c3=null;
c3=Class.forName ("com.stu.Student");

我们完全可以通过类的类类型创建该类的实例对象,通过c1,c2,c3创建Student类的实例。
可以通过c1.newInstance();//必须要有无参数的构造方法,因为默认会调用

2.说说Class/Java动态加载类

首先,什么是动态加载、什么是静态加载。
编译时刻加载类是静态加载,运行时刻加载类是动态加载类。
用new创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类。这是不太好的,可能我们真正需要的类已经存在了。
通过动态加载类可以解决这个问题,就是在运行的时候加载。在编译的时候不会报错。只有我把具体的类当参数传进去,如果没有才报错。
下面就是动态加载类:

不仅代表类类型,还代表动态加载类
Class class1=Class.forName("类名");
通过类类型创建对象
但是这里要注意,强制类型转换,可能我们传进来的不是Student呢,所以我们可以让可能传入的类去实现同一个接口,只要写一个接口的名字就可以。
这样的话,以后再来一个Person类,我们不需要去修改原来的类,只需要让心来的Person类实现那个统一的接口。
就像软件升级,以前的代码不需要改,如果改的话就要重新编译,所以不需要我们重新下载全新的代码去编译,都是添加一些实现统一接口的新的类,动态加载。

Student stu=(Student)class1.newInstance();

一般功能性的类都采用动态加载。

3.通过反射获取类的方法、变量等

我们来看看基本数据类型有没有类类型呢?

Class c=int.class;//是存在的,但和Integer.class完全不一样

String.class是String的类类型,也可以说是String类的字节码
还有很多关键字,比如void。
我们可以通过类类型去拿到类的所有方法,类类型就是String.class,Student.class

import java.lang.reflect.Method;
public class ClassUtil {
    public static void printClassMsg(Object obj){
        //要获取类的信息,首先要拿到类的类类型,我们从obj传入类
        Class c=obj.getClass();
        c.getName();//拿到类的全名
        /**
         * 万物皆对象,一个成员对象也是Method对象
         * getMethods()也可以拿到所有public方法和从父类继承来的
         */
        Method[] methods=c.getMethods();
    }
    public static void main(String[] args) {
    }
}

不仅类里面的成员函数是对象,成员变量也是对象,java.lang. reflect.Field封装了对成员变量的操作。

4、方法的反射

如何获取某个方法:方法的名称和参数列表可以唯一决定一个方法。重载就是同名参数列表不同。
方法的反射操作:method.invoke(对象,参数列表)

5、范性的本质,什么是范性,范性什么时候有效

通过Class,Method认识范性的本质
反射都是编译之后的操作,都是要拿到字节码之后的操作。
编译之后的集合是去范性化的,java中集合的范性是防止错误输入的,只在编译阶段有效,绕过编译就无效了。

java内存模型

内存模型的作用是屏蔽各种硬件和操作系统的差异。

相关文章

  • 开课吧大数据高级开发工程师 百度网盘分享

    课程大纲: java的基础课程(额外提供)阶段2:linux基础阶段3:java基础阶段4.5:mysql阶段6:...

  • java学习路径

    一、java基础知识 (30天) 1. 语言基础, java基础,环境变量 2. 语言基础, 进制转换 3. 语言...

  • Java 基础

    Java 基础01Java开发入门 Java 基础02Java编程基础 Java 基础03面向对象 Java 基础...

  • 开课吧-大数据高级开发工程师 百度网盘分享

    01.阶段1:java的基础课程02.阶段2:linux基础03.阶段3:java基础04.阶段4:mysql05...

  • 学习路线

    1、java基础 2、linux命令,软件安装 3、java-web:servlet 4、java-web:spr...

  • 2018-2019 目标技术栈

    一、java基础 1.Java 集合 2.Java 线程 3.Java io变成 4.Java 网络编程 二、my...

  • Java基础知识整理(一)

    1.Java基础知识体系 2.Java技术体系平台 3.Java语言特点与核心机制 1.Java基础知识体系 2....

  • Java基础3

    接口 当一个抽象类中的方法都是抽象的时候 可以将该抽象类用另一种方式表示 即接口 定义接口的关键字是 Interf...

  • java基础(3)

    引用数据类型(reference type):用在对象上的,一个对象可以被多个引用所指向。如果一个对象被多个引用所...

  • Java基础3

    Object equals 方法 默认比较对象的地址值(有空指针报错可能)Objects.equals静态方法比较...

网友评论

      本文标题:java基础3

      本文链接:https://www.haomeiwen.com/subject/meilpqtx.html