反射机制

类型信息(反射,RTTI)

房东的猫 提交于 2019-12-04 03:50:10
类型信息 1.java如何在运行时识别对象和类的信息 "传统的"RTTI run-time type identification ,假设我们在编译时已经知道了所有类型,在编译的时候打开和检查.class文件 反射机制,允许在运行时发现和使用类的信息,在运行的时候打开和检查.class文件 运行时的类型信息使得你可以在程序运行时发现和使用类型信息 2.Class对象 Class对象这个特殊对象,包含了类有关的信息 每个类都有一个Class对象,保存在编译后的同名的 .class文件中 名词 类加载子系统 原生类加载器 所有的类都是对其第一次使用的时候,动态加载到JVM中,当程序创建第一个对 类的静态成员引用 时,就会加载这个类 构造器也是静态方法,new 在创建类的新对象的时候,也会被当做对类静态成员的引用 java程序运行时,不是将所有的类全部加载,而是需要的时候才进行加载 static初始化是在类加载的时候进行的 无论何时,只要想在运行时使用类型信息,就必须首先获得恰当的Class对象的引用 如何获得Class对象的引用? Class.forName("the class name"),不需要持有该类型的对象 就可以获得对象 T.class ,类字面常量 (注意,这个方法创建对Class对象的引用时,不会自动地初始化该Class对象) Object.getClass()

Java反射机制

∥☆過路亽.° 提交于 2019-12-03 17:06:38
 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。 2 | 0 意义 (1)反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。 (2)通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。 (3)使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。 (4)反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。 3 | 0 反射机制的相关类 3 | 1 与Java反射相关的类如下: 与Java反射相关的类如下: 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造方法 3 | 2 Class类 获得类相关的方法 方法 用途 asSubclass(Class<U> clazz) 把传递的类的对象转换成代表其子类的对象 Cast 把对象转换成代表类或是接口的对象 getClassLoader() 获得类的加载器 getClasses() 返回一个数组

反射,魔法方法

孤街浪徒 提交于 2019-12-03 16:51:18
魔法方法: isinstance / issubclass : # isinstance(o,c) -- 判断前者是否为后者所创建的对象 print(isinstance(b,A)) # True print(isinstance(b,B)) # True # issubclass --判断前者是否为后者的子类 print(issubclass(B,A)) # True 反射 : 指主要是指程序可以访问、检测和修改它本身状态或行为的一种能力; 反射的优点:可实现一种可插拔机制, hasattr / setattr / getattr / delattr 函数 : # hasttr - 查看该对象是否可以使用该属性或者方法 print(hasattr(p, "name")) # getattr - 获取对象属性 print(getattr(p, "character")) # == p.character # 可以指定第三个参数,当属性不存在时返回该值,而不会报错 # print(getattr(p,"balabala")) # 报错 # setattr -修改对象属性 setattr(Programmer, "character", "handsome") # == Programmer.character = "handsome" # delattr - 删除该属性

Java 反射机制中 getMethod()和getDeclaredField()区别

六眼飞鱼酱① 提交于 2019-12-03 15:30:48
今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来找到 getDeclaredField()能够访问本类中定义的所有方法。后来用这个方法解决了我遇到的问题。我查了java api文档,其中详细说明如下: Method getDeclaredMethod(String name, Class… parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 Method getMethod(String name, Class… parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口

反射

自古美人都是妖i 提交于 2019-12-03 11:59:59
Java高级特性——反射 概述 定义 JAVA反射机制 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 用途 在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。 反射机制的相关类 与Java反射相关的类如下: 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造方法 Class类 Class 代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。 获得类相关的方法 方法 用途 asSubclass(Class<U> clazz) 把传递的类的对象转换成代表其子类的对象 Cast

反射与类对象获取-Java学习

浪子不回头ぞ 提交于 2019-12-03 09:59:00
类对象 类对象指的是一个类在jvm中加载后所形成的对象,每一个类都只有一个类对象,该类对象被所有的实例对象所共享。 类之间有不同的方法,不同的属性。类对象,就是用于描述这种类,都有什么属性,什么方法的。 获取类对象有三种方式: Class.forName Hero.class new Hero().getClass() Class pClass1 = Class.forName(className); Class pClass2 = Hero.class; Class pClass3 = new Hero().getClass(); 一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的( 一个ClassLoader下,一种类只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader ) 获取类对象的时候,会导致类属性被初始化 无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化) 反射 与传统的通过new来获取对象的方式不同,反射机制,会先拿到“类对象”,然后通过类对象获取“构造器对象”,再通过构造器对象创建一个对象 //传统的使用new的方式创建对象 Hero h1 =new Hero(); h1.name =

java的反射机制

女生的网名这么多〃 提交于 2019-12-03 05:29:46
newInstance方法:通过反射生成Student对象,Class c=Class.forName("com.Student"); Student s1=(Student)c.newInstance();//调用默认的无参构造函数 //想调用三个参数的构造 Constructor con=c.getConstructor(String.class,int.class,String.class); //用Consructor接收,参数指定类型的Class对象con.newInstance("lauraa",20,"women");(与这样的操作相同: Student s=new Student("lauraa",20,"women");通过反射生成对象:重写toString方法后,可打印 Student{name='lauraa', age=20, sex='women'} Class c2=Class.forName("com.load.Student");//包路径Student s1=(Student)c2.newInstance();Constructor con=c2.getConstructor(String.class,int.class,String.class); //想调用三个参数的构造 Student stu=(Student)con.newInstance

JAVA反射机制,总结下

て烟熏妆下的殇ゞ 提交于 2019-12-03 03:44:14
1、总体概述 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制 2、反射的用途,意义 (1)反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。 (2)通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。 (3)使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。 (4)反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。 3、反射机制的相关类 3.1、与Java反射相关的类如下: 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造方法 3.2、Class类: 获得类相关的方法 方法 用途 asSubclass(Class<U> clazz) 把传递的类的对象转换成代表其子类的对象 Cast 把对象转换成代表类或是接口的对象 getClassLoader() 获得类的加载器 getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象

java oop第11章_反射、BaseDao的进一步改造

点点圈 提交于 2019-12-03 01:33:34
引言:从Java5开始,Java中引用了一个新的概念反射,当程序运行时,能动态感知到程序中拥有的所以信息,这个获取信息的过程是采用反射机制来完成。 一、 Class 类:   Class 类用于保存Java程序中所有接口、类、数组所编写的所有消息,一旦我们创建以个接口、类、数组时会在Class类中被注册,即保存所有信息。   当我们需要获取某个接口、类、数组中的信息时就可以先获取他们在Class中注册的对象,通过该对象再调用反射机制提供的一些方法来获取、操作。 二、 获取某个接口、类或数组在Class中注册的对象: 1. 通过调用getClass()方法获取: Grade grade = new Grade(); Class gradeClss = grade.getClass(); 2. 通过接口、类访问class静态属性获取: Class studentClass = Student.class; 3. 通过全类名的方式获取: Class driverClass = Class.forName( "com.mysql.jdbc.Driver" ); 三、 通过Class对象调用反射机制提供的方法完成操作: /** * 通过反射获取Grade的属性 * 若调用带有getDeclared开头的方法,表示不管该资源是否是私有的,全部都能访问 */ @Test public void

用反射的方法获取枚举值(数据字典)

匿名 (未验证) 提交于 2019-12-03 00:40:02
最近有这么一个需求,希望把系统中的枚举类型作为数据字典返回给前端,做编辑页的下拉选项。因为枚举类型很多,一个一个提供接口就有点儿太low了……,所以想到了java的反射机制。在网上找到了一个例子,作为参考: Java 将枚举存入List集合( https://blog.csdn.net/qq_22158021/article/details/78091978 ) 我并没有做得那么复杂,只是简单的使用了反射机制,直接上代码: 接口类,所有的枚举类型都继承这个接口类: package com.my.utils; public interface EnumMessage { String getKey(); String getValue(); } 枚举类: package com.my.enumtype; import com.my.utils.EnumMessage; public enum Status implements EnumMessage { ACTIVE("正常"), CLOSED("关闭"), DELETED("删除"); public String getDesc() { return desc; } private String desc; private Status(String desc) { this.desc = desc; } @Override