主要介绍以下几方面内容
-
理解 Class 类
-
理解 Java 的类加载机制
-
学会使用 ClassLoader 进行类加载
-
理解反射的机制
-
掌握 Constructor、Method、Field 类的用法
1.理解Class类
–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
–Class 对象只能由系统建立对象
–一个类在 JVM 中只会有一个Class实例
–每个类的实例都会记得自己是由哪个 Class 实例所生成
1: Class是什么?
Class类的构造器由private修饰,且只有一个。类似单例形式。forName方法返回了Class类型。
Class是一个类:
public class ReflectionTest { @Test public void testClass() { Class clazz = null; } } //Class的定义 public final class Class<T> implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement { ..... ..... ..... }//小写class表示是一个类类型,大写Class表示这个类的名称
2.获取Class对象的三种方式
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
3.Constructor
String className = "com.atguigu.java.fanshe.Person"; Class<Person> clazz = (Class<Person>) Class.forName(className); //1. 获取 Constructor 对象 // 1.1 获取全部 Constructor<Person> [] constructors = (Constructor<Person>[]) Class.forName(className).getConstructors(); for(Constructor<Person> constructor: constructors){ System.out.println(constructor); } // 1.2获取某一个,需要参数列表 Constructor<Person> constructor = clazz.getConstructor(String.class, int.class); System.out.println(constructor); //2. 调用构造器的 newInstance() 方法创建对象 Object obj = constructor.newInstance("zhagn", 1);
4.Method
由于一个类中 天生就有很多方法,所以获取方法一定是获取一个方法组。
Mehod类中的invoke方法就是相当于执行被引用的方法。
m.invoke(obj, args);//obj代表了被引用的对象,args就是被引用方法的参数
Method methods[] = clazz.getMethods(); for(Method m : methods) { if(m.getName().equals("show")) { System.out.println(m); m.invoke(obj, args); } }