欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

框架基础:反射

程序员文章站 2022-03-16 14:51:20
框架设计的灵魂...

目录

一:概念

二:获取Class对象的方式

(一)Class.forName("全类名"):

(二)类名.class:

(三)对象.getClass():

三:Class对象功能

(一)获取功能

(二)Field:成员变量

(三)Constructor:构造方法

(四)Method:方法对象

四:案例:


框架设计的灵魂

一:概念

框架:半成品软件。可以在框架的基础上进行软件开发,简化编码

反射:将类的各个组成部分封装为其他对象,这就是反射机制

好处:
        1. 可以在程序运行过程中,操作这些对象。
        2. 可以解耦,提高程序的可扩展性。

框架基础:反射

二:获取Class对象的方式

(一)Class.forName("全类名"):

将字节码文件加载进内存,返回Class对象
        * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
        * 全类名=包名+类名

(二)类名.class:

通过类名的属性class获取
        * 多用于参数的传递

(三)对象.getClass():

getClass()方法在Object类中定义着。
        * 多用于对象的获取字节码的方式

public class Stduent {

    String name;
    int age;
}
public class StudentText {

    public static void main(String[] args) throws ClassNotFoundException {
        //Class.forName("全类名")
        Class s=Class.forName("MyClass.框架基础.Stduent");
        System.out.println(s);

        //类名.class
        Class s1 =Stduent.class;
        System.out.println(s1);

        //对象.getClass()
        Stduent std =new Stduent();
        Class s2 = std.getClass();
        System.out.println(s2);
    }
}

三:Class对象功能

(一)获取功能

获取成员变量们

  1. Field[] getFields() :获取所有public修饰的成员变量
  2.  Field getField(String name)  : 获取指定名称的 public修饰的成员变量
  3. Field[] getDeclaredFields()  :获取所有的成员变量,不考虑修饰符
  4. Field getDeclaredField(String name)  

获取构造方法们

  1. Constructor<?>[] getConstructors()  :获取所有public修饰的成员方法 
  2. Constructor<T> getConstructor(类<?>... parameterTypes)  
  3. Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) :获取所有的方法变量,不考虑修饰符
  4. Constructor<?>[] getDeclaredConstructors()  

获取成员方法们:

  1. Method[] getMethods()  
  2. Method getMethod(String name, 类<?>... parameterTypes)  :方法名称,可变参数的class
     
  3. Method[] getDeclaredMethods()  
  4. Method getDeclaredMethod(String name, 类<?>... parameterTypes)  

获取全类名    

  1. String getName() 

(二)Field:成员变量

设置值

  •  void set(Object obj, Object value) :对象,数值

获取值

  • get(Object obj):对象

  忽略访问权限修饰符的安全检查

  •   setAccessible(true):暴力反射
public class StudentText {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        Stduent st =new Stduent();
        //获取Class对象
        Class aClass = st.getClass();

        Field[] fields = aClass.getFields();
        for(Field field :fields){
            System.out.println(field);
        }

        System.out.println("---------------------------");
        System.out.println(aClass.getField("age"));

        System.out.println("++++++++++++++++++++++++++++");
        Field scoreField = aClass.getDeclaredField("score");//private int score;

        //暴力反射
        scoreField.setAccessible(true); 
        //设置值
        scoreField.set(st,88);
        //获取值
        System.out.println(scoreField.get(st));

    }
}

(三)Constructor:构造方法

 创建对象:

  • T newInstance(Object... initargs)  
  • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

忽略访问权限修饰符的安全检查

  • setAccessible(true):暴力反射
public class StudentText {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Stduent st =new Stduent();
        Class<? extends Stduent> aClass = st.getClass();

        Constructor<? extends Stduent> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class);

        Stduent sshyes = declaredConstructor.newInstance("sshyes", 18, 99);

        System.out.println(sshyes);
    }
}

(四)Method:方法对象

执行方法:

  • Object invoke(Object obj, Object... args) :对象,参数列表

获取方法名称:

  • String getName:获取方法名
public class StudentText {

    public static void main(String[] args) {
        Stduent st =new Stduent();

        Class<? extends Stduent> aClass = st.getClass();

        try {
            Method eatStudent = aClass.getMethod("eat",String.class); //方法名,参数的class列表
            Object st1 = eatStudent.invoke(st,"饭"); //对象名,参数的名称
            System.out.println(st1);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        
        
        Method[] methods = aClass.getMethods();
        for(Method method:methods){
            System.out.println(method);
            String nameMethod;
            nameMethod=method.getName(); //获取方法名
            System.out.println(nameMethod);
        }

        System.out.println("--------------------");
        //获取全类名
        String className=aClass.getName();
        System.out.println(className);
    }
}

四:案例

需求:

  • 写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法

实现:
            1. 配置文件
            2. 反射
 步骤:
            1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
            2. 在程序中加载读取配置文件
            3. 使用反射技术来加载类文件进内存
            4. 创建对象
            5. 执行方法

????(等java的基础复习完,在写)

本文地址:https://blog.csdn.net/weixin_44359595/article/details/109655917

相关标签: Java框架