正确情况下如果已经有一个类,则肯定可以通过类创建对象;那么如果现在要求通过一个对象找到一个类的名称,此时就需要用到反射机制
反射操作的核心概念:一切的操作都将使用 Object完成,类、数组的引用都可以使用Object 进行接收
一、认识 Class 类
从 Source 源代码阶段到 Runtime 运行阶段,需要借助类加载器将其加载进内存
正常情况下,需要先有一个类的完整路径引入后才可以按照固定的格式产生实例化对象,但是在 Java 中也允许通过一个实例化对象找到一个类的完整信息,这就是 Class 的功能。
package org.lxh.test;
class X{
}
public class GetClassDemo {
public static void main(String[] args) {
X x = new X();//实例化 X 类的对象
System.out.println(x.getClass().getName());//得到对象所在的类
}
}
结果显示通过一个对象得到了对象所在的完整的名称。
这里的 getClass()
方法是 Object 类的,因为任何一个类如果没有明确地声明继承自那个父类时,会默认继承 Object 类,方法的定义:
public final Class getClass()
- 1
这里也就是通过 Object 类中getClass()
方法实例
这里返回值的类型是一个 Class 类,实际上此类是 Java反射的源头。
所有类的对象实际上都是 Class 类的实例 – 深入理解
在 Java 中 Object 类是一切类的父类,那么所有类的对象实际上也就都是
java.lang.Class
类的实例,所以所有的对象都可以转变为java.lang.Class
类型表示
二、Class 类的常用方法
Class 本身表示一个类的本身,通过Class可以完整地得到一个类中的完整结构,包括此类中的方法定义、属性定义等。
package org.lxh.test;
class X{
}
public class GetClassDemo {
public static void main(String[] args) {
Class<?> c1 = null;//指定泛型
Class<?> c2 = null;//指定泛型
Class<?> c3 = null;//指定泛型
try{
c1 = Class.forName("org.lxh.test.X");//最常用的形式
}catch (ClassNotFoundException e){
e.printStackTrace();
}
X x = new X();//实例化对象
c2 = x.getClass();//通过 Object 类中方法实例
c3 = X.class;//通过类.class实例化
System.out.println("类名称:" + c1.getName());//得到类的名称
System.out.println("类名称:" + c2.getName());
System.out.println("类名称:" + c3.getName());
}
}
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
使用 forName() 方法更加具备灵活性