18反射
底层技术 通常用来实现框架和工具
运行时类型判定
类对象 Class类的对象
类加载:当JVM第一次使用一个类的时候,它需要将这个类对应的字节码文件读入JVM,从而获取这个类的全部信息(类的父类,有哪些属性,方法,构造方法等等),并保存起来。(保存在JVM的方法区)
类对象:类加载的产物,包含了一个类的全部信息
Dog类
-
类的对象:该类的对象 大黄 Dog类
-
类对象: 纪录类信息的对象 记录Dog信息的对象 Class类
获得类对象的三种方法
-
类名.Class 直接获得类对象 也可以获取8种基本类型的类对象
-
类的对象.getClass() 获得类对象
-
Class.forName("类的全名") 通过类名字符串,获得类对象。可能会先加载该类
Class c1 = ArrayList.class;
List l = new ArrayList();
Class c2 = l.getClass();
System.out.println(c1 == c2);
String classname = "java.util.ArrayList";
Class c3 = Class.forName(classname);
System.out.println(c2==c3);
Class对象的方法
-
getName() 获得类名
-
getSuperclass() 获得父类的类对象
-
getInterface() 获得所有接口的类对象
-
getMethods() 获得类中所有公开方法的Method对象,java.lang.reflect.Method:保存了一个方法的信息
-
getDecalredMethods() 获得本类中所有方法的Method对象
-
getMethod()/getDeclaredMethod() 根据方法名和参数表,获得类中的某个方法 返回值Method对象
类对象.newInstance() 通过类对象,创建类的对象
//Student s = new Student();
Scanner sc = new Scanner(System.in);
String classname = sc.next();
Class c = Class.forName(classname);
Object o = c.newInstance();
Method对象.invoke() 通过Method方法,调用该方法
// s.study();
String methodname =sc.next();
Method m =c.getMethod(methodname)
m.invoke(o);
调用对象的私有方法
String methodname ="study";
Method m =c.getDeclaredMethod(methodname);
m.setAccessible(true);//设置方法可访问性为真
m.invoke(o);