探索JVM

Class类概念:

Class也是一个Java类,保存的是与之对应Java类的meta信息(元信息),用来描述这个类的结构,比如描述一个类有哪些成员,有哪些方法等。一般在反射中使用。

Java编译原理:

Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例(Class对象)。也就是说,在Java中,每个java类都有一个相应的Class对象,用于表示这个java类的类型信息。

类加载概念:

Java编译器加载:

当使用一个类的时候(比如new一个类的实例),会检查此类是否被加载到内存,如果没有,则会执行加载操作。

手动加载:

Java也提供了手动加载类的接口,class.forName()方法就是其中之一。

类加载器的概念

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。

JAVA类加载流程

Java语言系统自带有三个类加载器:
- Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。
- Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
- Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

我们上面简单介绍了3个ClassLoader。说明了它们加载的路径。并且还提到了-Xbootclasspath-D java.ext.dirs这两个虚拟机参数选项。

加载顺序?

我们看到了系统的3个类加载器,但我们可能不知道具体哪个先行呢?
我可以先告诉你答案
1. Bootstrap CLassloder
2. Extention ClassLoader
3. AppClassLoader

 

反射:

反射详解

https://blog.csdn.net/sinat_38259539/article/details/71799078

反射是框架设计的灵魂

使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

 

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

总结:反射就是把java类中的各种成分映射成一个个的Java对象

Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

 

Class类:

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

Object obj = stuClass.getConstructor().newInstance();//产生Student对象--Student stu = new Student();

 

通过反射获取构造方法:

package fanshe;



import java.lang.reflect.Constructor;





/*

 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;

 *

 * 1.获取构造方法:

 *          1).批量的方法:

 *                 public Constructor[] getConstructors():所有"公有的"构造方法

            public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

    

 *          2).获取单个的方法,并调用:

 *                 public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:

 *                 public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

 *         

 *                 调用构造方法:

 *                 Constructor-->newInstance(Object... initargs)

 */

public class Constructors {



       public static void main(String[] args) throws Exception {

              //1.加载Class对象

              Class clazz = Class.forName("fanshe.Student");

             

             

              //2.获取所有公有构造方法

              System.out.println("**********************所有公有构造方法*********************************");

              Constructor[] conArray = clazz.getConstructors();

              for(Constructor c : conArray){

                     System.out.println(c);

              }

             

             

              System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");

              conArray = clazz.getDeclaredConstructors();

              for(Constructor c : conArray){

                     System.out.println(c);

              }

             

              System.out.println("*****************获取公有、无参的构造方法*******************************");

              Constructor con = clazz.getConstructor(null);

              //1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型

              //2>、返回的是描述这个无参构造函数的类对象。

      

              System.out.println("con = " + con);

              //调用构造方法

              Object obj = con.newInstance();

       //    System.out.println("obj = " + obj);

       //    Student stu = (Student)obj;

             

              System.out.println("******************获取私有构造方法,并调用*******************************");

              con = clazz.getDeclaredConstructor(char.class);

              System.out.println(con);

              //调用构造方法

              con.setAccessible(true);//暴力访问(忽略掉访问修饰符)

              obj = con.newInstance('男');

       }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值