反射机制

java 反射机制

[亡魂溺海] 提交于 2019-11-26 21:49:41
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。 下面开始正文。 【案例1】 通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ // other codes... } class hello{ public static void main(String[] args) { Demo demo = new Demo(); System.out.println(demo.getClass().getName()); } } 【运行结果】: Reflect.Demo 添加一句:所有类的对象其实都是Class的实例。 【案例2】实例化Class类对象 package Reflect; class Demo{ // other codes... } class hello{ public static void main(String[] args) { Class <?> demo1= null ; Class <?> demo2= null ; Class <?> demo3= null ; try { // 一般尽量采用这种形式 demo1=Class.forName(

Java学习:反射机制简介

橙三吉。 提交于 2019-11-26 20:07:37
反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制 。 通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。 反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 反射机制的使用 想要使用反射机制,就必须要先获取到该 类的字节码文件对象(.class), 通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是 字节码文件对象。 获取字节码文件对象的三种方式。 1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。 2、Class clazz2 = Person.class;    //当类被加载成.class文件时,此时Person类变成了.class

反射---Java高级开发必须懂的

只谈情不闲聊 提交于 2019-11-26 20:06:15
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。 一、Class类的使用 1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以 我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为 java.lang.Class类的构造方法是私有的 2、任何一个类都是Class类的实例对象,这个实例对象有 三种表示方式 :(我们新建一个Student类) ① Class c1 = Student.class;//实际告诉我们任何一个类都有一个隐含的静态成员变量class(知道类名时用) ② Class c2 = stu.getClass();//已知该类的对象通过getClass方法(知道对象时用) ③Class c3 = Class.forName("类的全名");//会有一个ClassNotFoundException异常 官网解释说:c1,c2表示了Student类的类类型()class type),万事万物皆对象,类也是对象,是Class类的实例对象,这个对象我们成为该类的类类型 (有点乱,但是慢慢捋一下还是能理解的) 这里有一点值得注意 ,当我们执行System.out.println(c1==c2);语句

Java 面向对象(十四)

天大地大妈咪最大 提交于 2019-11-26 20:04:31
反射 反射是框架设计的灵魂 一、类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 :就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。 连接:验证 是否有正确的内部结构,并和其他类协调一致。准备 负责为类的静态成员分配内存,并设置默认初始化值。 初始化:初始化成员变量等等。 加载时机 创建类的实例 访问类的静态变量,或者为静态变量赋值 调用类的静态方法 初始化某个类的子类 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 二、类加载器 什么是类加载器classLoader 负责将 .class文件加载到内存中,并为之生成对应的Class对象。 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。 类加载器分类 (1)根类加载器 也被称为引导类加载器,负责Java核心类的加载 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 (2)扩展类加载器 负责JRE的扩展目录中jar包的加载。 在JDK中JRE的lib目录下ext目录 (3)系统类加载器 负责在JVM启动时加载来自java命令的class文件 以及classpath环境变量所指定的jar包和类路径 三

使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

自古美人都是妖i 提交于 2019-11-26 19:30:26
Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案 如果你想明白为什么会出现这个错误 1、首先了解反射的机制 任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll 2、我们来看一下程序的代码和文件 web.config DalFacoty代码 我们找到web层的bin目录下,查看一下所有的程序集 很容易就会看出来,web下的bin目录并没有DBZQ.Answer.Dal.dll 3、为什么没有DBZQ.Answer.Dal.dll? 我们可以发现web/bin下有很多dll文件,就是没有DBZQ.Answer.Dal.dll文件 为什么? 我们先看看程序中有多少层 然后和dll文件仔细对比一下,发现只有9个dll文件,少了两个(DBZQ.Answer.Test和DBZQ.Answer.Dal) DBZQ.Answer.Test只是我平时写项目时做测试用的,没有任何层调用了Test层,会不会和引用有关系? 然后我们仔细理一下调用关系 不难发现,web层无论是直接还是间接,都引用了所有层,除了Dal层,这是我们就可以大胆的猜测,可能是引用的关系 会心一笑

Java之反射

那年仲夏 提交于 2019-11-26 19:27:46
内容介绍 类加载器 反射构造方法 反射成员变量 反射成员方法 反射配置文件运行类中的方法 1 类加载器 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将class文件读入内存,并为之创建一个Class对象。 任何类被使用时系统都会建立一个Class对象 连接   验证 是否有正确的内部结构,并和其他类协调一致   准备 负责为类的静态成员分配内存,并设置默认初始化值   解析 将类的二进制数据中的符号引用替换为直接引用 初始化   就是我们以前讲过的初始化步骤 1.2 类初始化时机 1. 创建类的实例 2. 类的静态变量,或者为静态变量赋值 3. 类的静态方法 4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 5. 初始化某个类的子类 6. 直接使用java.exe命令来运行某个主类 1.3 类加载器 负责将.class文件加载到内在中,并为之生成对应的Class对象。 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行 1.4 类加载器的组成 Bootstrap ClassLoader 根类加载器   也被称为引导类加载器,负责Java核心类的加载   比如System,String等。在JDK中JRE的lib目录下rt

java反射的功能

∥☆過路亽.° 提交于 2019-11-26 18:45:28
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的 成员变量 和方法;在运行时调用任意一个对象的方法;生成动态代理。 有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口 动态绑定 (dynamic binding)、 动态链接 (dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像面向对象当初被导入编程领域一样,一人一把号,各吹各的调。 一般而言,开发者社群说到 动态语言 ,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。 尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种

java 反射 :setAccessible

依然范特西╮ 提交于 2019-11-26 18:30:25
写框架大多要用上。在写框架时,大多要调用用户自定义的类,并生成对象,调用用户的方法。由于框架事前不知道用户的类,因此需要反射。反射的主要功能,当用户指定了类位置与类名,就能生成该类的对象,并调用其方法。 比如你要通过一个属性的名字去获取或设置自定义vo的属性值,继承多态是实现不了的.... 测试结果 引用 false Simple :4969 setAccessible(true) :250 明显 Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false 使用了method.setAccessible(true)后 性能有了20倍的提升 Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查 JDK API中的解释 引用 AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。 在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java

面向对象之 元类 , 反射 , 双下方法

◇◆丶佛笑我妖孽 提交于 2019-11-26 18:03:00
1.元类 type type元类,又称为构建类,python中一切皆对象, 类 也可以理解为对象,python中自己定义的类,以及大部分内置类,都是由type元类实例化得来的 元类type class A: pass obj = A() print(type('abc')) #<class 'str'> print(type([1,2,3])) #<class 'list'> print(type((22,33))) #<class 'tuple'> print(type(A)) #<class 'type'> print(type(str)) #<class 'type'> print(type(type)) #<class 'type'> print(type(object)) #<class 'type'> type 与 object 的关系 : object是type类的实例,而type类是object类的子类 print(type(object)) # <class 'type'> object类是type类的一个实例化对象 print(isinstance(type,object)) #True 结果为真,说明object是type类的实例化对象 print(issubclass(type,object)) #True 结果为真,说明type类是object类的子孙类

面向对象:反射和双下方法

走远了吗. 提交于 2019-11-26 17:39:55
面向对象:反射和双下方法 1.元类type type:获取对象从属于的类 class A: pass obj = A() print(type(A)) print(type('abc')) print(type([1,2,3])) python中一切皆对象,类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类都是由type元类(构建类)实例化得来的 type 与 object 的关系 object类是type类的一个实例,object类是type的父类. print(type(object)) print(issubclass(type,object)) 2.反射 反射:程序对自己内部代码的一种自省方式. 反射是通过字符串去操作对象的方式. 四个维度:实例对象,类,本模块,其他模块 四个方法: hasattr,getattr,setattr,delattr 1.实例对象: class A: country = "中国" def __init__(self,name,age): self.name = name self.age = age def func(self): print("in A func") obj = A("奇奇",18) #hasattr print(hasattr(obj,'name')) #True print(hasattr(obj,