Java高级----反射总结

    科技2024-10-15  16


    一、class对象概念

      (1) Class类也是类的一种,与class关键字是不一样的。   (2) 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。   (3) 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。   (4) Class类只存在私有构造函数,因此对应Class对象只能有JVM创建和加载。   (5) Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要。

    二、获取class(字节码)对象的方式

    1、对象.getClass()方法
    package fanse; public class Customer { String name; int age; String address; String tel; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public Customer(String name, int age, String address, String tel) { super(); this.name = name; this.age = age; this.address = address; this.tel = tel; } } package fanse; import java.lang.reflect.Modifier; public class CustomerDemo { public static void main(String[] args) { //1.对象.getClass(); Customer c = new Customer("timi", 20, "河南郑州","18749125463"); //通过反射拿到Customer的Class对象 Class c1 = c.getClass(); //输出Customer对象的全类名 System.out.println(c1.getName()); //输出简类名 System.out.println(c1.getSimpleName()); //输出父类的全类名 System.out.println(c1.getSuperclass().getName()); //获取权限修饰符 System.out.println(c1.getModifiers()); //输出底层权限修饰符public的数值 System.out.println(Modifier.PUBLIC); } }
    2、类名.class
    //通过类名.class的方式获取Class对象 Class c1 = Customer.Class();
    3、Class.forName(“全类名”)方法
    4、类加载器:Class c3 = ClassLoader.getSystemClassLoader().loadClass(“全类名”);
    5、class对象常用方法:

      (1) getName(): 获得类的名称,包括包名。   (2) getSimpleName(): 获得类的名称,不包括包名。   (3) getSuperClass(): 获得本类的父类的class对象。   (4) getInterfaces():获得本类所实现的所有接口的class对象。   (5) getModifiers():获取字段的权限修饰符。   (6) getModifiers():Modifier.PUBLIC;输出底层权限修饰符public的数值。

    三、通过反射实例化对象的步骤

      第一步: 获取class(字节码)对象   第二步: 通过class对象.newInstance()

    四、反射包(java.lang.reflect)

    1、(字段)Field类

      (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); }
    2、Method(方法)类

      (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)

    3、Constructor(构造方法)类

      (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

    Processed: 0.020, SQL: 8