(1) Class类也是类的一种,与class关键字是不一样的。 (2) 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。 (3) 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。 (4) Class类只存在私有构造函数,因此对应Class对象只能有JVM创建和加载。 (5) Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要。
(1) getName(): 获得类的名称,包括包名。 (2) getSimpleName(): 获得类的名称,不包括包名。 (3) getSuperClass(): 获得本类的父类的class对象。 (4) getInterfaces():获得本类所实现的所有接口的class对象。 (5) getModifiers():获取字段的权限修饰符。 (6) getModifiers():Modifier.PUBLIC;输出底层权限修饰符public的数值。
第一步: 获取class(字节码)对象 第二步: 通过class对象.newInstance()
(1) getDeclaredField(String name):获取本类中声明的属性,不包括继承过来的。 (2) Field getField(String name):Class对象.getField获取用public修饰的属性以及继承过来的public字段。 (3) getDeclaredFields():获取本类中所有的属性(四种权限修饰符修饰的),不包括继承过来的字段。 (4) Field[] getFields():取得所有public的属性,包括继承的,接口中声明的和自己定义的。 (5) 常用方法 ① getModifiers():获取属性的修饰符。
public static void getDeclareField() throws Exception { Class c = Customers.class ; //getDeclaredF ield :获取本类中申明的字段 Customers customer = (Customers) C.newInstance( ); Field phone = c.getDeclaredField("phone"); //通过这种方式可以直接给私有属性phone赋值。 phone.setAccessible(true); phone.set (customer,"18337275355") ; System.out.println(phone.getModifiers());② 字段对象.get(对象A):获取对象A中的属性。
public static void getDeclareField() throws Exception { Class c = Customers.class ; //getDeclaredF ield :获取本类中申明的字段 Customers customer = (Customers) C.newInstance( ); Field phone = c.getDeclaredField("phone"); //通过这种方式可以直接给私有属性phone赋值。 phone.setAccessible(true); phone.set (customer,"18337275355") ; System.out.println(phone.get(customer)); }③ set(对象, 属性):通过这种方式可以直接给私有属性赋值。
public static void getDeclareField() throws Exception { Class c = Customers.class ; //getDeclaredF ield :获取本类中申明的字段 Customers customer = (Customers) C.newInstance( ); Field f = c.getDeclaredField("name"); //通过这种方式可以直接给私有属性赋值。 f.set (customer," tomcat") ; System.out.println(f); }④ 属性对象.setAccessible(boolean flag):设置属性是否可访问,给私有属性赋值的时候用。
public static void getDeclareField() throws Exception { Class c = Customers.class ; //getDeclaredF ield :获取本类中申明的字段 Customers customer = (Customers) C.newInstance( ); Field phone = c.getDeclaredField("phone"); //通过这种方式可以直接给私有属性phone赋值。 phone.setAccessible(true); phone.set (customer,"18337275355") ; //获取属性的名字 System.out.println(phone.getName()); System.out.println(phone); }(1) public Method[] getDeclaredMethods():获取本类中声明的所有方法,不包括继承过来的方法。 (2) public Method[] getMethods():获取所有public声明的方法,包括继承的、接口中声明的和自己定义的方法。 (3) public Method getMethod(String name, Class<?>… parameterTypes):根据参数名字和类型,获取指定的用public修饰的方法,包括继承的与接口中的。 (4) public Method getDeclaredMethod(String name, Class<?>… parameterTypes) : ① getDeclaredMethod():可获取class对应的类中的声明的所有方法,不包括继承过来的方法 ② 第一个参数:方法名 ③ 余下参数:参数列表 ④ 注意:获取方法时参数类型、class对象的顺序要和方法定义的参数列表类型顺序保持一致。 (5)常用方法 ① getModifiers():获取方法的修饰符 ② getReturnType():获取方法的返回值类型 ③ getName():获取方法的名字 ④ getParameterCount():获取方法的参数个数 ⑤ Parameter[ ] Parameters():获取方法中的参数列表 (6) 如何通过方法对象调用本方法
方法对象.invoke(参数1、参数2....) 参数1:调用方法的对象 参数2:调用方法需要的参数的实参(7) 如何调用私有方法 设置方法可访问:方法对象.setAccessible(true)
(1) 作用:用来实例化对象 ① 构造方法对象.newInstance(参数); ② 构造方法对象.setAccessible(true);解决私有构造方法的实例化对象。 (2) 通过Class对象的如下方法可以获得Constructor对象 ① Constructor[ ] getDeclaredConstructors():取得class对象中所有的构造方法。 ② Constructor[ ] getConstructors():取得class中public修饰的构造方法,无法直接获得父类的构造方法。 ③ Constructor getConstructor(参数1、参数2…)根据参数类型获取对应的构造方法,只获取用public修饰的,如果想获取无参的构造方法,里面不写参数即可。 ④ Constructor getDeclaredConstructor(参数1、参数2…)根据参数类型获取对应的构造方法,四种权限修饰符都可以 (3) 常用的方法 ① getModifiers():获取构造方法的修饰符 ② getName():获取构造方法的名字 ③ getParameterCount():获取构造方法的参数个数 ④ Parameter[] getParameters():获取构造方法中的参数列表
反射机制就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查,进行装载,还可以获取类本身,类的所有成员变量和方法,类的对象,还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法,这就是反射机制一个比较重要的功能了。那么要通过程序来理解反射机制,首先要理解类的加载过程。 原文链接:https://blog.csdn.net/qq_39209361/article/details/81239189