反射机制

【Java基础】反射篇

跟風遠走 提交于 2019-12-25 10:35:09
前言:java如何在运行时识别对象和类的信息.有两种实现方式 传统RTTI 反射 RTTI和反射有什么区别? 对RTTI来说,编译器在编译时打开和检查.class文件而反射机制来说,.class文件在编译时是不可获取得,所以在运行时打开和检查.class文件() 反射是框架设计的灵魂 原理 : 反射首先是能够获取到Java中的反射类的字节码,然后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类 应用 :取出类的modifiers,数据成员,方法,构造器,和超类 找出某个接口里定义的常量和方法说明. 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到. 在运行时刻调用动态对象的方法. 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 二 反射的作用 总结:通过Class类与java.lang.reflect类库一起对反射进行支持 反射的使用网上教程很多,研究Class类,Filed

面试常见的问题之 Java 基础

怎甘沉沦 提交于 2019-12-25 06:08:10
一、谈谈对 JVM、JRE 和 JDK 的理解。 JVM Java 虚拟机(Java Virtual Machine, JVM):是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现,即相同的字节码文件,通过虚拟机都会输出相同的结果, 这也是为什么 Java 是跨平台的。 JRE Java Running Enviroment: Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他一些基础构件。 但是,他不能用于创建新线程。 JDK Java Development Kit: 它是功能强大的 Java SDK。拥有 JRE 所有的一切,还有编译器(javac) 和工具(如 javadoc 和 jdb)。 它能够创建和编译程序。 综上: JVM 是运行 Java 字节码的虚拟机,是保证“一次编译,随处运行”的关键;JRE 只能运行 Java 程序,如果需要 Java 编程相关的工作,就必须安装 JDK。 二、Java 和 C++ 的区别。 很多面试官都会问,所有有必要了解两种语言的区别。 都是面向对象的语言,所有两者都支持继承、封装、多态; Java 不提供指针来直接访问内存,程序会更加安全; Java 里的类只能单继承(Java 里的可以多继承接口),而 C++

在 .NET 4.5 中反射机制的变更

回眸只為那壹抹淺笑 提交于 2019-12-25 03:24:52
反射机制(Reflection)通常会涉及到3中场景: 运行时反射 场景:可以检索已加载程序集、类型、对象、实例和方法调用的元数据(Metadata)。 .NET 支持情况:支持 仅供静态分析的反射 场景:可以检索程序集中定义的类型和对象的元数据,而不会产生其他副作用。 .NET 支持情况:有限的支持 反射扩展性 场景:在上述两种场景下扩展元数据。 .NET 支持情况:支持,但非常复杂 System.Type 是反射模型中的最主要的抽象和入口点。它被用于描述两种相关但却不同的概念:基本信息 (reference) 和定义 (definition) ,并使两者之间可以互操作。这使得其并不满足关注点分离( Separation of Concerns )设计原则。 从概念上讲, reference 是某种事物的浅显表述,而 definition 提供更丰富的表述。例如 System.Reflection.Assembly 类代表了程序集的 definitions ,而System.Reflection.AssemblyName 类则代表了程序集的 references 。前者暴露了丰富的功能,而后者仅是提供能够获取定义的数据。 .NET 4.5 中包含了一些对传统反射机制的变更。其中最重要的变化是,System.Type 类被分割至两个独立的类中:Type 和 TypeInfo

java反射机制

試著忘記壹切 提交于 2019-12-24 11:55:24
转自:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。 二、哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义。听了反射机制这节课后,才知道,原来这就是反射,现在很多开框架都用到反射机制,hibernate、struts都是用反射机制实现的。 三、反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念, 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了

Java反射(一)

你。 提交于 2019-12-24 04:26:27
一、反射定义 在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。 二、涉及到概念Class、Constructor、Field、Method Class 程序运行期间,Java运行时系统为所有对象维护的一个被称为运行时的类型标识。 获取Class方式三种: 1)getClass ( ) 2).class 2)静态方法 forName public class User { private String userName ; private int age ; public String getUserName ( ) { return userName ; } public void setUserName ( String userName ) { this . userName = userName ; } public int getAge ( ) { return age ; } public void setAge ( int age ) { this . age = age ; } public User ( ) { this . userName = "" ; this . age = 1 ; } public User (

java的反射

荒凉一梦 提交于 2019-12-24 00:57:28
什么是java反射?: JAVA反射机制是在运行状态中,通过ClassLoad加载类到JVM(动态加载机制、懒加载)的同时通过JDK中已经定义好的Class类(字节码文件对象)能够知道、操作这个类的所有属性、方法;Class文件对象的newInstance方法可以对某个类进行实例化生成对象,也能够获取它的任意方法和属性信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 Class c = Class . forName ( "User" ) ; //Loader进具体的类 Method [ ] m = c . getMethods ( ) ; //获取这个类的所有方法 Field [ ] f = c . getFields ( ) ; //获取这个类的属性 Object o = c . newInstance ( ) ; //实例化成对象 for ( Method method : m ) { if ( method . getName ( ) . equals ( "m" ) ) { method . invoke ( o ) ; //现在遍历的是方法想要调用方法需要一个对象 } } Class类中方法返回值类型也是其他系统类的对象! 类名 作用 Class 类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量

反射

隐身守侯 提交于 2019-12-23 04:46:22
思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? Java中创建对象大概有这几种方式: 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去 3、使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象 上边是Java中常见的创建对象的三种方式,其实除了上边的三种还有另外一种方式,就是接下来我们要讨论的 “反射” 一、什么是反射? 1.1、概念 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。 反射就是把Java类中的各种成分,映射成一个个的java对象,拿到这些对象后可以做一些事情。

java反射机制

南笙酒味 提交于 2019-12-23 00:49:56
一、java反射机制 首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制; 简单说,反射机制指得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字(类的全路径),那么就可以通过反射机制来获得类的所有信息。 大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。不使用反射的话,我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类已经被加载了。 Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类,这样的特点就是反射。 二、反射作用 假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制

python面向对象之反射

六眼飞鱼酱① 提交于 2019-12-22 19:05:58
反射在类中的使用 isinstance(a对象, B类) 判断a对象是否属于B类,是返回 Trun ,不是返回 False 。 class Aniaml: pass class Person(Aniaml): pass class Student(Person): pass aniaml = Aniaml() person = Person() student = Student() lis = list() print(isinstance(aniaml,Aniaml)) print(isinstance(person,Aniaml)) print(isinstance(student,Aniaml)) print(isinstance(lis,Aniaml)) True True True False issubclass(A类,B类) 判断A类 是否 是B类的子类 class Aniaml: pass class Person(Aniaml): pass class Student(Person): pass aniaml = Aniaml() person = Person() student = Student() lis = list() print(issubclass(Person,Aniaml)) # Person类是否是Aniaml类的子类,True print

反射(hasattr和getattr和setattr和delattr)

帅比萌擦擦* 提交于 2019-12-22 15:01:28
目录 一、反射在类中的使用 1.1 应用 二、反射在模块中的使用 2.1 前言 2.2 反射机制 2.2.1 getattr() 2.2.2 hasattr(object, name) 2.2.3 setattr(object, name, value) 2.2.4 delattr(object, name) 2.3 应用 一、反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有以下四个内置函数: 1. hasattr:判断一个方法是否存在与这个类中 2. getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行 3. setattr:通过setattr将外部的一个函数绑定到实例中 4. delattr:删除一个实例或者类中的方法 class People: country = 'China' def __init__(self, name): self.name = name def eat(self): print('%s is eating' % self.name) peo1 = People('nick') print(hasattr(peo1, 'eat')) # peo1.eat True print(getattr(peo1, 'eat')) # peo1.eat <bound