01.Java反射机制
1.基本概念
- 通常情况下编写代码都是固定的,无论运行多少次执行的结果也是固定的,在某些特殊场合中编写代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递的参数来决定,该机制叫做动态编程技术,也就是反射机制。
- 通俗来说,反射机制就是用于动态创建对象并且动态调用方法的机制。
- 目前主流的框架底层都是采用反射机制实现的。
如:
Person p = new Person(); - 表示声明Person类型的引用指向Person类型的对象
p.show(); - 表示调用Person类中的成员方法show
2.Class类
基本概念
- java.lang.Class类的实例可以用于描述Java应用程序中的类和接口,也就是一种数据类型。
- 该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造完成,本质上就是加载到内存中的运行时类。
2.1获取Class对象的方式
- 使用数据类型.class的方式可以获取对应类型的Class对象(掌握)。
- 使用引用对象.getClass()的方式可以获取对应类型的Class对象。
- 使用包装类.TYPE的方式可以获取对应基本数据类型的Class对象。
- 使用Class.forName()的方式来获取参数指定类型的Class对象(掌握)。
- 使用类加载器ClassLoader的方式获取指定类型的Class对象。
2.2几种获取Class对象的方式
2.2.1使用数据类型.class的方式:
- 代码示例:
public static void main(String[] args) {
Class c1 = String.class;
System.out.println("c1=" + c1); //输出: class java.lang.String
Class<Integer> c2 = int.class;
System.out.println("c2=" +c2); //输出:int
Class<Void> c3 = void.class;
System.out.println("c3=" + c3); //输出:void
Class c4 = double[].class;
System.out.println("c4=" + c4); //输出:calss getName()
}
-
结合jdk手册来看
-
运行结果
2.2.2使用引用对象.getClass()的方式
public static void main(String[] args) {
//使用对象.getClass()方式获取对象的Calss对象
String str1 = new String("hello");
Class c1 = str1.getClass();
System.out.println("c1 ="+ c1);// class java.lang.String
Integer it = 10;
Class c2 = it.getClass();
System.out.println("c2 ="+ c2);// class java.lang.Integer
int it2 = 20;
// it2.getClass(); Error: 基本数据类型的变量不能调用方法
}
-
运行结果
2.2.3使用包装类.TYPE的方式
示例代码:
//使用包装类。TYPE的方式来获取对应基本数据类型的Class对象
Class cl1 = Integer.TYPE; //对应的就是int
System.out.println("cl1 = " +cl1); //输出:int
// 区别
Class cl2 = Integer.class;
System.out.println("cl2=" + cl2);//输出:class java.lang.Integer
结果:
2.2.4使用Class.forName()的方式
1.代码示例
public static void main(String[] args) throws ClassNotFoundException {
//使用Class.forName()的方式
// Class c1 = Class.forName("String");//错误:要求写完整的名称 : 包名.类名
Class c2 =Class.forName("java.lang.String");
System.out.println(c2);
Class c3 = Class.forName("java.util.Date");
System.out.println("c3= "+ c3);
}
2.运行结果
2.2.5使用类加载器ClassLoader的方式
代码示例
//使用类加载器ClassLoader的方式
// ClassLoader classLoader = String.class.getClassLoader();
// System.out.println("classLoader = " +classLoader);//null
ClassLoader classLoader = Invoke03.class.getClassLoader();
System.out.println("classLoader = " +classLoader);
Class c4 =classLoader.loadClass("java.lang.String");
System.out.println("c4 = " + c4);//class java.lang.String
运行结果
2.3常用的方法(掌握)
方法声明 | 功能介绍 |
---|---|
static Class<?> forName(String className) | 用于获取参数指定类型对应的Class对象并返回 |
T newInstance() | 用于创建该Class对象所表示类的新实例 |