一、反射
1.反射(Reflection):允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。
2.类对象和类的对象(实例)
(1) 类的对象(实例):基于某个类 new 出来的对象,也称为实例对象。(2) 类对象:类加载的产物,封装了一个类的所有信息(包、类名、父类、接口、属性、方法、构造方法等)
3. 获取类对象的三种方式:
(1) 通过类的对象,获取类对象Student s = new Student();Class c = s.getClass();(2) 通过类名获取类对象Class c = 类名 .class;(3) 通过静态方法获取类对象Class c=Class.forName(“ 包名 . 类名 ”);注意:需要 权限类名:包名.类名
public class TestClass {public static void main(String[] args) throws ClassNotFoundException {// 深入 JVM 实现原理 / JVM 规范// 通过反射技术 获取 类对象Student s = new Student(); // 类的对象,实例Class c=s.getClass(); // 获取类对象System.out.println(c);// 第二种方式:Class c2=Class.forName("testflect.Student");System.out.println(c2);System.out.println(c==c2);Class c3 = Student.class;System.out.println(c3);}}
4. 反射常见的方法:
Class c = Class.forName("testflect.Student");
// 动态 操作类中信息System.out.println(c.getName());// 获取类名System.out.println(c.getPackage().getName());// 获取包名System.out.println(c.getSuperclass().getName()); // 获取父类Class[] cs=c.getInterfaces();// 获取 实现的接口System.out.println(" 实现的接口数量为: "+cs.length);for(Class inter:cs){System.out.println(inter.getName());}Method[] ms = c.getMethods();// 获取公开方法:自定义 + 父类中System.out.println("Student 类定义的方法数量为: "+ms.length);for(Method m:ms){System.out.println(m.getName());}System.out.println("--------------");Method[] mds = c.getDeclaredMethods();// 获取自定义方法,包含非公开的System.out.println("Student 类中自定义的方法为: "+mds.length);for(Method m:mds){System.out.println(m.getName());}System.out.println(" 获取属性: ");Field[] fs = c.getDeclaredFields();// 获取自定义属性:包含非公开的for (Field f:fs){System.out.println(f.getName());}
通过反射技术获取实例:// 通过类对象 获取 类的对象--- 采用无参数的构造方法获取对象Class c = Class.forName("testflect.Student");Object obj = c.newInstance();// 默认采用无参数的构造方法Student s =(Student)obj;s.setName(" 佳明 ");s.setAge(28);s.setScore(99.0);System.out.println(obj);-- 采用有参数的构造方法获取对象System.out.println(" 利用有参数的构造方法获取对象: ");Constructor con=c.getConstructor(String.class,Integer.class,Double.class);Object obj2=con.newInstance(" 杨浩 ",37,88.0);System.out.println(obj2);// 利用反射技术操作私有化的方法Method md=c.getDeclaredMethod("test");md.setAccessible(true);md.invoke(obj2);