首页 > 其他分享 >反射

反射

时间:2024-09-09 21:24:03浏览次数:4  
标签:反射 System Class public println class out

反射是为学习框架的底层源码做准备。

定义:反射就是加载类,并允许已编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

反射_成员变量

1.获取Class的三种方式

反射_构造器_02

首先要创建一个Student类


public class test {
    public static void main(String[] args) throws Exception {
        Class c1 = Student.class;
        System.out.println(c1.getName()); // 全类名
        System.out.println(c1.getSimpleName()); // 简名: Student

        Class c2 = Class.forName("com.d2_reflect.Student");
        System.out.println(c1 == c2);

        Student s = new Student();
        Class c3 = s.getClass();
        System.out.println(c3 == c2);
    }
}

2.获取类的构造器

反射_System_03

下面代码可以拿到cat类的构造器

public class test {
    @Test
    public void testGetConstructors() {
        // 1. 反射第一步,必须先得到这个类的Class对象
        Class c = Cat.class;

        // 2. 获取类的全部构造器
        Constructor[] constructors = c.getDeclaredConstructors();

        // 3. 遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + " ---> " + constructor.getParameterCount());
        }
    }
            @Test
        public void testGetConstructor() throws Exception {
            // 1. 反射第一步,必须先得到这个类的Class对象
            Class c = Cat.class;
        
            // 2. 获取某个构造器,无参数构造器
            Constructor constructor = c.getDeclaredConstructor();
            System.out.println(constructor.getName() + " ---> " + constructor.getParameterCount());
        
            // 3. 获取有参数构造器
            Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);//后边加上参数类型
            System.out.println(constructor2.getName() + " ---> " + constructor2.getParameterCount());
}

}

反射_构造器_04

public class test {

           @Test
        public void testGetConstructor() throws Exception {
            // 1. 反射第一步,必须先得到这个类的Class对象
            Class c = Cat.class;

            // 2. 获取类的某个构造器,无参数构造器
            Constructor constructor1 = c.getDeclaredConstructor();
            System.out.println(constructor1.getName() + " ---> " + constructor1.getParameterCount());

            constructor1.setAccessible(true); // 取消检查访问权限,暴力访问
            Cat cat = (Cat) constructor1.newInstance();
            System.out.println(cat);
            
            
            
            // 3. 获取有参数构造器
            Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);
            System.out.println(constructor2.getName() + " ---> " + constructor2.getParameterCount());
            
            constructor2.setAccessible(true); // 取消检查访问权限
            Cat cat2 = (Cat) constructor2.newInstance("叮当猫", 3);
            System.out.println(cat2);

}

}

3.获取类的成员变量

反射_成员变量_05

public class test {

    @Test
public void testGetFields() throws Exception {
    // 1. 反射第一步,必须先得到类的Class对象
    Class c = Cat.class;

    // 2. 获取类的全部成员变量
    Field[] fields = c.getDeclaredFields();

    // 3. 遍历这个成员变量数组
    for (Field field : fields) {
        System.out.println(field.getName() + " ---> " + field.getType());
    }

    // 4. 定位某个成员变量
    Field fName = c.getDeclaredField("name");
    System.out.println(fName.getName() + " ---> " + fName.getType());

    Field fAge = c.getDeclaredField("age");
    System.out.println(fAge.getName() + " ---> " + fAge.getType());
}


}

反射_System_06

// 赋值
Cat cat = new Cat();
fName.setAccessible(true); // 取消访问控制权限
fName.set(cat, "卡菲猫");
System.out.println(cat);

// 取值
String name = (String) fName.get(cat);
System.out.println(name);

4.获取类的成员方法

反射_成员变量_07

  

public class test {

    @Test
    public void testGetFields() throws Exception {
        // 1. 反射第一步,必须先得到类的Class对象
       // 1. 反射第一步,先得到Class对象。
    Class c = Cat.class;

    // 2. 获取类的全部成员方法。
    Method[] methods = c.getDeclaredMethods();

    // 3. 遍历这个数组中的每个方法对象。
    for (Method method : methods) {
        System.out.println(method.getName() + " ---> "
            + method.getParameterCount() + " ---> "
            + method.getReturnType());
    }

    // 4. 获取某个方法对象
    Method run = c.getDeclaredMethod("run"); // 拿run方法,无参数。
    System.out.println(run.getName() + " ---> "
        + run.getParameterCount() + " ---> "
        + run.getReturnType());

    Method eat = c.getDeclaredMethod("eat", String.class);
    System.out.println(eat.getName() + " ---> "
        + eat.getParameterCount() + " ---> "
        + eat.getReturnType());


    }


}

反射_System_08

Cat cat = new Cat();
run.setAccessible(true); // 取消检查访问权限
Object rs = run.invoke(cat); // 调用无参数的run方法,用cat对象触发调用
System.out.println(rs);

eat.setAccessible(true); // 取消检查访问权限
String rs2 = (String) eat.invoke(cat, "鱼儿"); // 调用有参数的eat方法
System.out.println(rs2);

反射的作用及应用场景

基本作用:可以得到一个类的全部成分然后操作。

可以破快封装性

最重要:适合做Java的框架,基本数,主流的框架会基于反射设计出一些通用的功能。

反射_System_09

public class test {
    @Test
    public void save() throws Exception {
        Student s1 = new Student("马吴彦祖", 45, '男', 185.3, "篮球,冰球,游泳");
        Teacher t1 = new Teacher("珊姐", 999.9);

        // 把任意对象的字段名和其对应的值等信息,保存到文件中去。
        ObjectFrame.saveObject(s1);
        ObjectFrame.saveObject(t1);
    }
}

框架

public class ObjectFrame {
    // 目标: 保存任意对象的字段和其数据到文件中去
    public static void saveObject(Object obj) throws Exception {
        PrintStream ps = new PrintStream(new FileOutputStream("junit-output.txt", true));
        
        // obj是任意对象,剥夺有多少个字段需要保存。
        Class c = obj.getClass();
        String cName = c.getSimpleName();
        ps.println("=============== " + cName + " ===============");

        // 2. 从这个类中提取出的全部成员变量
        Field[] fields = c.getDeclaredFields();

        // 3. 遍历成员变量
        for (Field field : fields) {
            // 4. 获取变量的名字
            String name = field.getName();

            // 5. 突破javabean规范进行直接访问
            field.setAccessible(true); // 取消检查访问控制
            String value = field.get(obj) + "";
            ps.println(name + " = " + value);
        }
        ps.close();
    }
}

两个学生和老师的构造器自己写一下。

标签:反射,System,Class,public,println,class,out
From: https://blog.51cto.com/u_16382144/11963157

相关文章

  • Matlab 声波黑洞捕获波:同时减少声音反射和传播(APL文章)
    参考文献:[1]MiY,ZhaiW,ChengL,etal.Wavetrappingbyacousticblackhole:Simultaneousreductionofsoundreflectionandtransmission[J].AppliedPhysicsLetters,2021,118(11):114101-. DOI:10.1063/5.0042514.        在许多应用中,以行波形......
  • Java中的反射
    1.1反射的概述:专业的解释(了解一下):反射允许对封装类的字段,方法和构造函数的信息进行编程访问是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机......
  • 反射的应用
     importcn.iocoder.yudao.hospital.dal.dataobject.family_friends.HFamilyInfoIncremental;importcn.iocoder.yudao.hospital.dal.dataobject.user.FoodAllergyIntoleranceIncremental;importcn.iocoder.yudao.hospital.dal.dataobject.user.HBodyBasicInfo;importc......
  • C#反射(Reflection)
    反射指程序可以访问,检测和修改它本身状态或行为的一种能力.程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集,模块和类型的对象.可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段......
  • 谈谈java的反射机制
    java中的反射机制是指在运行时动态地获取一个类的信息,包括类的属性,方法,构造函数等,不需要事先知道这个类的具体实现。反射的优点有:反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力,比如Class.forName(StringclassName)就可以根据类名获取对应的类......
  • 传输线与反射
    本文主要内容本文主要描述阻抗突变对信号产生的影响**摘要:**如果信号沿着连接线传播时,受到的瞬时阻抗发生变化,则有一部分信号将发生反射,另一部分发生失真并传播下去。**影响:**反射和失真会造成信号质量下降,引起信号电平下降可能会超过噪声容限,造成误触发。**产生阻抗的......
  • JAVA反射机制【超详细!!】
    JAVA反射机制反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射就是把java类中的各种成分映射成一个个......
  • 14 Python面向对象编程:反射
    本篇是Python系列教程第14篇,更多内容敬请访问我的Python合集在Python中,“反射”通常指的是根据字符串查找并执行相关的类、方法或者属性的能力。Python提供了几个内置函数和语法特性来支持这种能力,比如getattr(),setattr(),hasattr(),delattr()以及dir()等。这些功能......
  • BGP路由反射器,路由聚合,对等体组配置使用
    BGP路由反射器,路由聚合,对等体组配置使用R1interfaceLoopBack0ipaddress192.168.0.1255.255.255.0interfaceLoopBack1ipaddress192.168.1.1255.255.255.0interfaceGigabitEthernet0/0portlink-moderoutecomboenablecopperipaddress100.1.1.1255......
  • 《C++中的反射机制:开启高级编程之门》
    一、引言在现代编程中,反射机制是一种强大的工具,它允许程序在运行时检查和操作对象的结构和行为。虽然C++语言本身并没有内置的反射机制,但通过一些技巧和技术,我们可以在C++中实现类似的功能。本文将深入探讨如何在C++中实现反射机制,以及它在实际编程中的应用。二、什么......