基本概念
- 反射机制就是用于动态创建对象并且动态调用方法的机制。
- 意思是在编写代码时不确定创建什么样的对象和调用什么样的方法,直到运行阶段才知道,根据运行阶段传入的参数决定,这也叫做动态编程技术
- 反射机制就是可以在运行阶段决定创建什么样的对象和调用什么样方法的机制。
Class类
Class类能帮助我们实现动态编程
基本概念
- java.lang.Class类的实例可以用于描述Java程序中的类和接口,也就是可以表示一种数据类型
- Class类的对象与我们平常new的对象不一样,这是一种数据类型
- 这个class类没有公共构造方法(不能new对象),这个类的实例都是由Java虚拟机和类加载器自动构造完成(不需要自己去new),本质上就是加载到内存中的运行时类(类也是特殊的对象)
获取class对象的方式
- 使用数据类型.class的方式可以获取对应类型的Class对象
- 使用.getClass()方式获取对应的Class对象
public class ClassTest {
public static void main(String[] args) {
//1.使用数据类型.class的方式可以获取对应类型的Class对象
Class c1 = String.class;
System.out.println("c1="+c1);//调用了toString方法 class类型会输出包名.类名 即class.java.lang.String
c1 = int.class;
System.out.println("c1="+c1);//若此类对象表示基本类型,则此方法返回基本类型的名称
c1 = void.class;
System.out.println("c1="+c1);//若此类对象表示void类型,则此方法返回void
System.out.println("----------------------");
//2.使用.getClass()方式获取对应的Class对象
String str1 = new String("hello");
c1= str1.getClass();
System.out.println("c1="+c1);
Integer it1 = 20;
c1= it1.getClass();
System.out.println("c1="+c1);
int num = 5;
//num.getClass Error:基本数据类型的变量不能调用方法
System.out.println("----------------------");
//
}
}
- 使用包装类.TYPE的方式可以获取对应基本数据类型的Class对象
//3.使用包装类.TYPE的方式可以获取对应基本数据类型的Class对象
c1 = Integer.TYPE;
System.out.println("c1="+c1);//int
c1 = Integer.class;
System.out.println("c1="+c1);//class java.lang.Integer
- 调用Class类中的forName方法来获取对应的Class对象
//4.调用Class类中的forName方法来获取对应的Class对象
//c1 = Class.forName("String");这样是不行的 Error 要求写完整名称 包名.类名
c1 = Class.forName("java.lang.String");
System.out.println("c1="+c1);//class java.lang.String
c1 = Class.forName("java.util.Date");
System.out.println("c1="+c1);//class java.util.Date
//c1 = Class.forName("int");
//System.out.println("c1="+c1);//不能这样获取基本数据类型的Class对象
//5.使用类加载器的方式来获取class对象
ClassLoader classLoader = ClassTest.class.getClassLoader();
c1 = classLoader.loadClass("java.lang.String");
System.out.println("c1="+c1);//class java.lang.String
第一和第四种要求掌握