9.反射的基本原理

1.反射的原理

  * 应用在一些通用性比较高的代码中

  * 例如后面学到的框架,大多数都是使用反射来实现的

  * 在框架开发中,都是基于配置文件开发

    在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某些方法来执行

  * 类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法

  * 画图分析反射的原理

      * 首先需要把java文件保存到本地硬盘上 .java

      * 编译java文件,成.class文件

      * 万事万物都是对象,class文件在内存中使用class类表示

      * 当使用反射时候,首先需要获取到class类,得到这个类之后,就可以得到class文件中的所有内容

      * 属性通过一个类 Field 表示

      * 构造方法通过一个类 Constructor 表示

      * 普通方法通过一个类 Method类 表示

2.实例

Persion类

package Day5;

public class Persion {
    //属性
    private String id;
    private String name;

    //没有参数的构造方法
    public Persion() {}

    //有参数的构造方法
    public Persion(String id , String name) {
        this.id = id;
        this.name = name;
    }

    //普通方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  (1)获取class类的三种方式

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Persion.class;
        Class c2 = new Persion().getClass();
        //注意参数为包名+类名,推荐使用这种方式
        Class c3 = Class.forName("Day5.Persion");
    }
}

  (2)操作无参数的构造方法

  @Test
    public void test1() throws Exception   {
        //获取calss类
        Class c3 = Class.forName("Day5.Persion");
        //获取persion类的实例(当创建persion实例的时候,无参数的构造方法已经运行了)
        Persion persion = (Persion) c3.newInstance();
        //通过persion实例调用里面的普通的方法
        persion.setName("张三");
        //我们来查看我们设置的值是否成功
        System.out.println(persion.getName());
    }

  (3)操作有参数的构造方法

  @Test
    public void test2() throws Exception {
        //获取class类
        Class c3 = Class.forName("Day5.Persion");
        //获取有参数的构造方法(c3.getConstructors();  获取所有的构造方法)
        //里面的参数是使用class形式传递的(persion有参的构造方法是String类型)
        //java.lang.reflect.Constructor
        Constructor cs =  c3.getConstructor(String.class,String.class);
        //通过有参数的构造方法获取persion实例
        Persion persion = (Persion) cs.newInstance("101","张三");
        //输出我们设置的值
        System.out.println(persion.getId()+" "+persion.getName());
    }

  (4)操作属性

@Test
    public void test3() throws Exception {
        //获取class类
        Class c3 = Class.forName("Day5.Persion");
        //获取persion的实例
        Persion persion = (Persion) c3.newInstance();
        //获取name属性
        Field field = c3.getDeclaredField("name");
        //因为我们定义的属性是私有的,所以不能直接操作,我们设置为可以操作私有属性
        field.setAccessible(true);
        //设置name的值为张三
        field.set(persion, "张三");
        //输出name属性的值
        System.out.println(field.get(persion));
    }

  (5)操作普通方法(如果方法为私用的。需要设置method.setAccessible(true))

    注意:当使用反射操作静态的方法的时候invokie方法的第一个参数里面写一个null

@Test
    public void test4() throws Exception {
        //获取class类
        Class c3 = Class.forName("Day5.Persion");
        //获取persion的实例
        Persion persion = (Persion) c3.newInstance();
        //获取setName普通方法(参数一:方法名     参数二:方法里面的参数类型)
        Method method = c3.getDeclaredMethod("setName", String.class);
        //通过获取的setName设置值
        method.invoke(persion, "张三");
        //输出
        System.out.println(persion.getName());
    }

原文地址:https://www.cnblogs.com/zjdbk/p/9221227.html

时间: 2024-08-08 16:38:02

9.反射的基本原理的相关文章

反射基本原理

反射的概念:   在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:    对于任意一个类,都能调用它的任意一个方法:    这种动态获取信息以及动态调用对象的功能成为Java语言的反射机制. 我们写的类在载入内存的时候jvm虚拟机是怎么识别到底哪个是变量,哪个是方法,哪个是修饰符的呢?          因为java中的Class也是一个对象,那么有对象就有对应的类,当在硬盘中的时候是一个文件,当载入内存的时候就可以看成一个对象.这个Class对象的成员

.NET基础拾遗(4)委托、事件、反射与特性

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 一.委托基础 1.1 简述委托的基本原理 委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多码农也喜欢称委托为安全的函数指针.无论这一说法是否正确,委托的的确确实现了和函数指针类似的功能,那就是提供了程序回调指定方法的机制. 在委托内部,包含了一个指向某个方法的指针(这一点上委托实现机制和C++的函数指针一致),为何称其

.NET基础 (17)反射

反射1 请解释反射的基本原理和其实现的基石2 .NET提供了哪些类型来实现反射3 如何实现动态地发射程序集4 如何利用反射来实现工厂模式 反射1 请解释反射的基本原理和其实现的基石 反射是一种动态分析程序集.模块.类型.字段等目标对象的机制,它的实现依托于元数据.元数据是存储在PE文件中的数据块,它详细记录了程序集后模块内部的结构.引用类型.程序集和清单. 2 .NET提供了哪些类型来实现反射 在System.Reflection命名空间下,.NET提供了丰富的实现反射机制的类型,可以达到读取元

.NET基础拾遗(5)反射1

1 反射的基本原理是什么? 反射是一种动态分析程序集.模块.类型及字段等目标对象的机制,实现依托于元数据. 元数据,就是描述数据的数据.在CLR中,元数据就是对一个模块定义或引用的所有东西的描述系统. 2 .NET中提供了哪些类型实现反射? 在.NET中,这些类型大多数都定义在System.Reflection命名空间之下,例如Assembly.Module等. 利用这些类型,我们就可以方便地动态加载程序集.模块.类型.方法和字段等元素. [Serializable] class SimpleC

摘录-IT企业必读的200个.NET面试题-06 .NET中的高级特性

委托 Q: 请解释委托的基本原理 委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,委托实现了回调方法的机制. Q: 委托回调静态方法和实例方法的区别 当委托绑定静态方法时,内部的对象成员变量_target将会被设置为null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法. Q: 什么是链式委托 链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所

ASP.NET工程师面试前需要认真准备的几大知识点。

凭借个人进几年的工作经验和面试经验以及个人认为比较重要的进行如下总结,希望对自己以后和对大家有所帮助.过于基础的问题就省略了. 1.C#语言的基础知识(网上有这发面的面试题对基础知识的涵盖面很全,面试钱一定要好好的做一下) 2.算法:冒泡排序.快速排序.快速排序的几大优化等.(一定要掌握几个不一定所有算法都要懂.一般面试官会出考题,问用什么样的算法处理,你就用你自己了解的算法来处理即可) 3.必须理解掌握的几个大概念如下 a) http协议的原理.Get和Post 的异同点(老生常谈的,不懂就没

.NET常见面试题

面试题 1  什么是 CTS.CLS 和CLR 公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库. 通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范. 公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集. 面试题 2   CLR 技术和 COM技术的比较 CLR 和 COM 都定义了组件间交互的规范.COM 并没有定义如何描述组件间的依赖性,并且由于其严格的物理

moon 反射机制---java.lang.reflect包

java反射机制:在运行状态中,对于一个已经加载到JVM的java对象/类 在程序中实现访问.检查.修改.描述java对象本身的信息(构造方法.方法.成员变量.类本身的信息) 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection, 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接. 二,反射机制的作用:

java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)

原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码, Class.forName("com.mysql.jdbc.Driver.cl