Class类
讲Class类之前先来认识一下反射
- 什么是反射?
- 反射被认为是动态语言的关键,反射机制允许程序在执行期间获取任何类的内部信息,并能操作其内部方法属性
- 简单来说,自定义类的时候经常会有private修饰的内部类,使用new方法创建实例是无法访问内部信息,但是通过反射机制可以访问
- 通过new方法创建实例或者使用反射机制创建实例,均可调用公共方法,怎么选择?
- 一般情况下还是建议使用new方法来创建实例
- 反射的特征:动态性。当需要动态调用时,则使用反射机制创建
- 反射机制是否与封装机制冲突?怎么理解?
- 不冲突
- 封装机制:我有内部方法,但是我提供了更好的外部方法供你使用,不建议使用内部方法
- 反射机制:我有权限访问内部方法,但是类提供了更好的外部方法,访问内部方法相当于无用功
关于Java.lang.Class类的理解
-
类的加载过程
程序执行javac.exe命令后,会生成一个或多个字节码文件(文件类型为.class)。
程序执行java.exe命令对某个class文件进行解析时,相当于讲某个字节码文件加载到内存中,此过程我们称之为类的加载过程,加载到内存中的类我们称之为运行时类,此运行时类就作为Class的一个实例
运行时类个人理解:我们创建对象时(Student s = new Student())s是一个对象,而Student这个类也是一个对象
-
在类加载时创建的运行时类会在缓存区存在一段时间,在此时间内获取的Class实例都指向同一个地址
-
获取Class实例的4种方式
- 通过运行时类.class获取
- 通过运行时类的对象获取
- 通过运行类的全路径获取
- 使用类的加载器:ClassLoader
public class ClassTest { //获取Class实例的4种方式 @Test public void test1() throws ClassNotFoundException { //1.通过运行时类.class获取 Class clazz1 = Person.class; System.out.println(clazz1); //2.通过运行时类的对象获取 Person p = new Person("Tom",21); Class clazz2 = p.getClass(); System.out.println(clazz2); //3.通过运行类的全路径获取 Class clazz3 = Class.forName("com.yellowstar.Pojo.Person"); System.out.println(clazz3); //4.使用类的加载器:ClassLoader ClassLoader classLoader = ClassTest.class.getClassLoader(); Class clazz4 = classLoader.loadClass("com.yellowstar.Pojo.Person"); System.out.println(clazz4); System.out.println(clazz1 == clazz2); System.out.println(clazz1 == clazz3); System.out.println(clazz1 == clazz4); } }
扩展:关于ClassLoader(类加载器)的理解
-
类加载器的作用
- 类加载器的作用是讲类(class)加载到内存中
-
Java提供的几种类加载器
- 引导类加载器:负责Java平台核心库,无法获取引导类加载器
- 扩展类加载器
- 系统类加载器
@Test public void test1(){ //自定义类是使用系统类加载器来装进内存的 ClassLoader classLoader1 = Person.class.getClassLoader(); System.out.println(classLoader1); //调用系统类加载器的getparent,来获取扩展类加载器 ClassLoader classLoader2 = classLoader1.getParent(); System.out.println(classLoader2); //调用扩展类加载器的getparent,无法获取引导类加载器 //引导类加载器主要是用来加载Java的核心类库(如String),无法加载自定义类 ClassLoader classLoader3 = classLoader2.getParent(); System.out.println(classLoader3); }
-
用途:properties加载配置文件
/* properties:加载配置文件 */ @Test public void test2() throws Exception { Properties properties = new Properties(); //加载配置文件的方式一 // FileInputStream fis = new FileInputStream("src\\jdbc.properties"); // properties.load(fis); //加载配置文件的方式二:使用ClassLoader ClassLoader classLoader = Person.class.getClassLoader();//获取系统类加载器 InputStream is = classLoader.getResourceAsStream("jdbc.properties");//这里注意路径实在src下的 properties.load(is); String name = properties.getProperty("name"); String age = properties.getProperty("age"); System.out.println(name); System.out.println(age); }