反射机制

Java 反射 Reflection

怎甘沉沦 提交于 2019-12-03 00:38:41
1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数、属性、父类、接口等 Class 内部信息的机制。通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种“看透 class”的能力被称为内省,这种能力在框架开发中尤为重要。 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运行时才存在的类(该类符合某种特定的规范,例如 JDBC),这是反射用得比较多的场景。 还有一个比较常见的场景就是编译时我们对于类的内部信息不可知,必须得到运行时才能获取类的具体信息。比如 ORM 框架,在运行时才能够获取类中的各个属性,然后通过反射的形式获取其属性名和值,存入数据库。这也是反射比较经典应用场景之一。 1.2 Class 类 那么既然反射是操作 Class 信息的,Class 又是什么呢? 当我们编写完一个 Java 项目之后,所有的 Java 文件都会被编译成一个.class 文件,这些 Class 对象承载了这个类型的父类、接口、构造函数、方法、属性等原始信息,这些 class 文件在程序运行时会被 ClassLoader 加载到虚拟机中。当一个类被加载以后,Java

BGP基础知识

匿名 (未验证) 提交于 2019-12-03 00:19:01
边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。 为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,外部网关协议EGP(Exterior Gateway Protocol)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。 BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。 虽然BGP用于在AS之间传递路由信息,但并不是所有AS之间传递路由信息都需要运行BGP。比如在数据中心上行的连入Internet的出口上,为了避免Internet海量路由对数据中心内部网络的影响,设备采用静态路由代替BGP与外部网络通信。 BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性。

面试(三)

匿名 (未验证) 提交于 2019-12-03 00:11:01
method:发送数据的方式; action:发给谁 单选框和复选框,name值必须相同,value值可以不同 单选:type=radio 复选:type=checkbox 常见浏览器的内核: Trident内核: IE浏览器,360,搜狗浏览器等 Gecko内核: Firefox浏览器 Presto内核: Opera(原为Presto内核,现在为Blink) Webkit内核: Google Chrome http常见的状态码有那些? 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误 Integer与int的区别 ① int 是java提供的8种原始 数据类型之一 。Java为每个原始类型提供了封装类,Integer是java为int提供的 封装类 。int的默认值为 0 ,而Integer的默认值为 null , 即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况 ,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

C# 反射

匿名 (未验证) 提交于 2019-12-02 23:47:01
反射: 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 优缺点 优点: 1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高自适应能力。 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。 缺点: 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。 可通过类名、成员的名字类进行对象的实例化、操作类成员 取得Assembly的方法: Assembly.Load Assembly.LoadFile Assembly.LoadFrom Type对象的Assembly方法 反射的成员: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等

笔试:通过反射机制访问私有化构造器例子

匿名 (未验证) 提交于 2019-12-02 23:40:02
问题:实例化对象时一定要用new调用构造方法吗? 答案:用普通的创建方法(new)是要调用构造方法,如果使用反射或者克隆这些就可以绕过构造函数直接创建对象 实例: /* * ClassTest.java -- JDK 1.8 */ package T20190328; import java.io.File; import java.io.IOException; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.junit.Test; import org.w3c.dom.Document;

反射

匿名 (未验证) 提交于 2019-12-02 23:36:01
反射 类加载器的概述 当程序要使用某个类时,如果该类还未被加载到内存中, 则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将class文件读入内存,并为之创建一个Class对象。 任何类被使用时系统都会建立一个Class对象。 连接 验证 : 是否有正确的内部结构,并和其他类协调一致 准备 : 负责为类的静态成员分配内存,并设置默认初始化值 解析: 把类中的符号引用转换为直接引用 初始化 就是我们以前讲过的初始化步骤 类的加载时机 创建类的实例 访问类的静态变量,或者为静态变量赋值 调用类的静态方法 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java.exe命令来运行某个主类 类加载器的分类 Bootstrap ClassLoader 根类加载器 Extension ClassLoader 扩展类加载器 Sysetm ClassLoader 系统类加载器 类加载器的作用 Bootstrap ClassLoader 根类加载器 也被称为引导类加载器,负责Java核心类的加载 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 Extension ClassLoader 扩展类加载器 负责JRE的扩展目录中jar包的加载。 在JDK中JRE的lib目录下ext目录

反射

匿名 (未验证) 提交于 2019-12-02 23:32:01
1:java开发工具可以帮助我们将代码编译为class字节码 2:类加载器加载class字节码,将字节码里面的指令放到内存执行,并且将数据动态分配到jvm内存呢模型中, 3:jvm'的分区 类的加载流程: 1:雷电加载指定就是将class文件找中的二进制数据读取到内存中。类、方法、常量、静态内容放到方法区。 2:但是要在堆中创建一个class对象,用开封装存储在方法区的数据结构 3:类的加载最终结果就是在对中产生了一个class对象,当前对象提供了访问方法区内容的接口 类加载器加载class文件,加载class文件有哪些方式: 1:直接从本地系统读取,直接加载 2:通过网络路径下载 3:zip,jar包读取文档中的class文件 4,从某些数据库中获取class文件 5:将java原文件动态编译成class文件 类的生命周期 类的加载过程: 加载、验证、准备、解析、初始化 加载:查找并加载类的二进制的数据 1:通过全限定名获取定义的而进制数据 2:将字节流所代表的静态储存内容放入方法区 3:在java堆中生成一个代表当前对象的java.lang.Class对象,作为方法区的访问接口,整个类的生命周期中,最容易控制的就是当前阶段,你可以自己定义类加载器来加载数据 验证:验证的主要目的是确保被加载类的正确性 验证主要内容是验证你的class文件的信息中是否符合java虚拟机加载的要求

反射(2019年10月28日)

早过忘川 提交于 2019-12-02 23:23:54
目前创建对象的三种方式:1.通过构造方法,用关键字new来创建对象 2.用clone来浅拷贝一个对象 3.利用反射机制,反射一个对象 反射方式创建类 ; 1 .利用已经存在的对象来反射新的对象 1 Student s = new Student(); 2 Class sClazz = s.getClass(); 2 .利用已知类名来创建对象 1 Class clazz = Student. class ; 3 .利用准确的类名来创建对象 1 Class clazz = Class.forName("com.bli.zyx.Student" ); 2 Student s= (Student)clazz.newInstance(); //newInstance会去找无参的构造方法执行,创建对象 如果对象中没有无参的构造方法,那么我们需要创建一个构造器来创建有参的构造方法 1 Constructor <Student> c=clazz.getConstructor(String.class,String.class);//利用构造器,后面的参数是构造函数中的形式参数类型 通过构造器的方式可以匹配不同的参数列表的构造方法       Constructor<Student> c = clazz.getConstructor(String.class,int.class);      

说说自定义注解的场景及实现

匿名 (未验证) 提交于 2019-12-02 22:59:29
登陆、权限拦截、日志处理,以及各种 Java 框架,如 Spring,Hibernate,JUnit 提到注解就不能不说反射,Java 自定义注解是通过运行时靠反射获取注解。实际开发中,例如我们要获取某个方法的调用日志,可以通过 AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。反射的实现在 Java 应用层面上讲,是通过对 Class 对象的操作实现的,Class 对象为我们提供了一系列方法对类进行操作。在 JVM 这个角度来说,Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目按严格的顺序紧凑的排列在 Class 文件中,里面包含了类、方法、字段等等相关数据。通过对 Class 数据流的处理我们即可得到字段、方法等数据。 转载请标明出处: 说说自定义注解的场景及实现 文章来源: 说说自定义注解的场景及实现

python 反射机制,excel数据读取

匿名 (未验证) 提交于 2019-12-02 22:51:30
反射机制 # 判断对象 有没有这个属性 hasattr ==》has attribute attribute(属性) # 字符串对应到 方法 python 反射机制。 has = hasattr(mydict,"keys") print(has) has = hasattr(s,"name") # 判断有没有属性 print(has) has = hasattr(s,"attend_course") print(has) # 判断有没有这个方法,方法也属于类的属性,只是表现形式不一样 # 获取对象的属性 getattr 获取对象属性 has = getattr(s,"name") # 如果是对象的属性,则返回具体的值 print(has) has = getattr(s,"attend_course") # 如果是对象的方法,则返回方法的内存地址 print(has) has = getattr(s,"attend_course11",None) # 如果获取的这个属性不存在,可以给个默认值,不存在则返回默认值,存在则返回具体的值或者内存 print(has) # 添加对象的属性 setattr # 添加对象的属性,把需要把属性与值传进去,也可以用于添加对象的方法,但目前无需掌握,比较难 # 只针对当前的对象,类的其他对象不受影响 has = setattr(s,"age","18