反射机制

Java学习之二-Java反射机制

﹥>﹥吖頭↗ 提交于 2020-01-02 18:24:34
问题: 在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现。 目录 什么是JAVA的反射机制 JDK中提供的Reflection API JAVA反射机制提供了什么功能 获取类的Class对象 获取类的Fields 获取类的Method 获取类的Constructor 新建类的实例 Class<T>的函数newInstance 通过Constructor对象的方法newInstance 调用类的函数 调用private函数 设置/获取类的属性值 private属性 动态创建代理类 动态代理源码分析 JAVA反射Class<T>类型源代码分析 JAVA反射原理分析 Class文件结构 JVM加载类对象,对反射的支持 JAVA反射的应用 一、什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

反射学习笔记

谁都会走 提交于 2020-01-01 19:58:26
title: 反射学习笔记 date: 2020-01-01 12:08:14 tags: categories: 概述 定义 JAVA反射机制 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 功能 运行时判断任意一个对象所属的类 运行时构造任一个类的对象 运行时判断任意一个类的成员变量和方法 运行时调用任意一个对象的成员变量和方法 动态代理(反射的关键应用) 主要API 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造的构造方法 Class类 在Object类中定义了getClass()方法,这个方法被所有子类继承 public final Class getClass() 实例化Class类对象的四种方法 通过类名创建 Class clazz = String.class; 通过实例创建 Class clazz = "www.xyz.com".getClass(); //通过String对象创建 通过类的全类名创建 Class clazz = Class.forName("java

反射机制

余生颓废 提交于 2019-12-31 08:05:21
先建立一个Person类,然后使用反射的一些方法获取Person类的属性和方法 Class<Person> clazz=Person.class; Person p=clazz.newInstance(); Field f=clazz.getField("name");//反射获取属性 Field f1=clazz.getField("age"); f.set(p, "卷发送到"); f1.set(p, 1231423); System.out.println(p); //反射获取方法 Method m1=clazz.getMethod("show");//无参数方法 m1.invoke(p); Method m2=clazz.getMethod("show", String.class);//有参数的方法 m2.invoke(p, "fjasldjfk"); 8.11 反射里面获取私有的指定的属性 Field ff=clazz.getDeclaredField("age");//获取指定的属性 ff.setAccessible(true);//把私有的age设置为可访问的 ff.set(p, 321); System.out.println(p); 反射里面获取私有的指定的构造器并赋值 Class clazz=Person.class; Constructor con=clazz

java反射(基础了解)

荒凉一梦 提交于 2019-12-31 08:04:24
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; /** 年龄 */ private int age; /** 性别 */ private String sex; public Person(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } public Person() { super(); // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }

(翻译)反射的第二部分:Emit

空扰寡人 提交于 2019-12-30 02:18:09
原文地址 作者:Mike Snell, Lars Powers 翻译:today 在我们之前的文章 , 反射的第一部分:发现和执行 里,我们已经介绍了 System.Reflection 命名空间及其包含的类,开发人员使用这些类可以查看程序集的元数据,并且可以在运行时查找和发现类型,甚至可以调用发现的代码。在这篇文章中,我们将探讨反射的高级功能: Emit ,它具有在运行时动态的产生代码的功效。 回顾反射 首先,让我们快速的回顾一下,什么是反射以及反射可以被用来做什么。从第一部分内容中,你已经知道,反射是在运行时发现对象的相关信息,并且执行这些对象(创建对象实例,执行对象上的方法)。这个功能是由 .NET 的 System.Reflection 命名空间的类所提供的。这些被用于类型发现和动态调用的类包括: Assembly , Module , ConstructorInfo , MethodInfo 以及其它。简单的说,它们不仅允许你浏览一个程序集暴露的类、方法、属性和字段,而且还允许你创建一个类型的实例以及执行这些类型上的方法(调用成员)。这些特性对于在运行时对象发现,已经很了不起了,但 .NET 的反射机制并没有到此结束。反射还允许你在运行时构建一个程序集,并且可以创建全新的类型。这就是反射发出( reflection emit )。 何谓反射发出( Reflection

【C#】反射机制

谁说胖子不能爱 提交于 2019-12-29 05:12:46
.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行操作 可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样 反射机制通常有下面一些用途 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private )和实现详细信息(如 abstract 或 virtual )等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。 使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private )和实现详细信息(如 abstract 或 virtual )等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法

.NET中反射机制的使用与分析

ぃ、小莉子 提交于 2019-12-28 14:17:24
.NET中反射机制的使用与分析 [日期: 2008-06-30 ] 来源: 作者: 志伟 .NET反射的定义 :审查元数据并收集关于它的类型信息的能力。 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中。 而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。 当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。 元数据以非特定语言的方式描述在代码中定义的每一类型和成员。元数据存储以下信息: 程序集的说明: 1. 标识(名称、版本、区域性、公钥)。 2. 导出的类型。 3. 该程序集所依赖的其他程序集。 4. 运行所需的安全权限。 类型的说明: 1. 名称、可见性、基类和实现的接口。 2. 成员(方法、字段、属性、事件、嵌套的类型)。 属性: 1. 修饰类型和成员的其他说明性元素。 System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码和反射相关的命名空间(我们就是通过这几个命名空间访问反射信息): System.Reflection.MemberInfo System

【java提高】---java反射机制

流过昼夜 提交于 2019-12-28 00:39:24
爬虫+jsoup轻松爬博客 最近的开发任务主要是爬虫爬新闻信息,这里主要用到技术就是jsoup,jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过 DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。这篇文章就讲通过jsoup爬虫的实际案例,下一篇再讲jsoup的具体文档。 主要爬虫对象就以我之前写的一篇博客: 【java提高】---java反射机制 主要爬区的信息有 (1)该文章的标题 (2)该文章的二类标题 (3)发表时间 (4)阅读数量 一、案例演示 1、代码部分 package com.jincou.pachong; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; /* * 这个案例你只需要看结果,具体的jsoup介绍下一篇博客会详细介绍 */ public class Pachong { public static void main(String args[]){ //这个就是博客中的java反射的url final String

Java中反射机制详解

安稳与你 提交于 2019-12-27 23:35:44
    序言       在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的。                                       ---WZY 一、什么是反射?     在运行状态中,对于 任意 一个类,都能够获取到这个类的所有属性和方法,对于 任意 一个对象,都能够调用它的 任意 一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。     想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。     获取字节码文件对象的三种方式。        1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName

Java反射机制浅析

落爺英雄遲暮 提交于 2019-12-27 23:35:24
概念   Java反射机制是在 运行状态 中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。   Class 类与java.lang.reflect类库一起对反射的概念进行了支持,该类库包含了 Field 、 Method 以及 Constructor 类(每个类都实现了 Member 接口)。这些类型的对象是由 JVM 在运行时创建的,用以表示未知类里对应的成员。这样开发人员就可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用 invoke() 方法调用与 Method 对象关联的方法。另外,还可以调用 getFields() 、 getMethods() 、 getConstructors() 等很便利的方法,以返回表示字段、方法以及构造器的对象的数组。这样,匿名对象的类信息就能在运行时被完全确认下来,而在编译时不需要知道任何事情。 Class   类是程序的一部分,每个类都有一个 Class 对象。换言之,每当编写并且编译一个新类,就会产生一个 Class 对象(更恰当地说,是被保存在一个同名的 .class 文件中),它包含了与类有关的信息。为了生成这个类的对象