反射机制

Java的反射机理

这一生的挚爱 提交于 2019-12-16 10:54:32
Java反射是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的全部属性和方法等,调用方法以及访问属性,而且不需要提前在编译期知道运行的对象是什么,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。 Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method; 其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。 Java反射的作用: 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。 Java 反射机制主要提供了以下功能 在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法。 在运行时调用任意一个对象的方法。 反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method; 其中class代表的是类对象,Constructor-类的构造器对象,Field

反射——CRUD小工具

浪子不回头ぞ 提交于 2019-12-16 10:45:02
反射——CRUD小工具 用反射封装了一个用于增删改查的工具类。现在市面上已经有很多成熟的持久层框架,所以这里只是为了熟悉反射机制,且了解一点市面上持久层框架最基础的原理。写的这个工具类有一些限制,比如实体类必须与表名一致,主键名字必须是id,实体类名字与数据库表名必须一致(如UserEntity – userEntity),实体类所有的字段和表的字段需要一致,究其原因是因为没有自己的专门用于关系映射的配置文件或者注解,想要解决关系映射也简单,将映射关系写进一个配置文件或者自己做注解开发做映射。 1、工具类 package com . xsl . util ; import java . lang . reflect . Constructor ; import java . lang . reflect . Field ; import java . sql . * ; import java . util . ArrayList ; import java . util . List ; /** * 一个Crud的小工具类,可以单表增删改查任何实体类 * 前提:表名与类名一致,表名开头小写,类名开头大写,类字段与表字段一致,表字段没有多余的无用字段 * @param <T>实体类 * @param <K>主键 * @author xsl */ public class

类加载器&反射&模块化

删除回忆录丶 提交于 2019-12-16 02:12:44
1.类加载器 1.1类加载【理解】 类加载的描述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化 类的加载 就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象 任何类被使用时,系统都会为之建立一个 java.lang.Class 对象 类的连接 验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致 准备阶段:负责为类的类变量分配内存,并设置默认初始化值 解析阶段:将类的二进制数据中的符号引用替换为直接引用 类的初始化 在该阶段,主要就是对类变量进行初始化 类的初始化步骤 假如类还未被加载和连接,则程序先加载并连接该类 假如该类的直接父类还未被初始化,则先初始化其直接父类 假如类中有初始化语句,则系统依次执行这些初始化语句 注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3 类的初始化时机 创建类的实例 调用类的类方法 访问类或者接口的类变量,或者为该类变量赋值 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java.exe命令来运行某个主类 1.2类加载器【理解】 1.2

面向对象语言-反射机制

谁都会走 提交于 2019-12-14 21:38:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java和C#是目前面向对象语言的代表性语言,Java语言是面向语言是代表。 今天主要就这两个面向对象语言的反射机制讨论一番, 其实要想了解反射本质,必须要深入的了解Java虚拟机和C#的运行时机制。要深入了解这些语言运行时具体机制和流程,日后会转本出一篇博客商讨,今天这里只是讨论使用反射的基本使用流程,以及反射基本原理。 Java是通过Class对象来洞悉类的全部信息,而C#则是通过Type类来洞悉类的全部信息。要想使用反射机制,必须要知道反射机制简单原理,任何一个类,无论是Java或者是C#,本质还是在运行时对类做了什么处理。简单来说,这些面向对象语言定义的类,加载到内存都都会生成一个与之对应的Class对象或者Type对象,Class对象和Type对象涵盖这个对象全部信息,所以要想使用反射,我们必须要获取去到类的这个唯一的对象Class或者Type。 Java要想获取一个类Class对象,加入有com.abaojin.Person类: Class c1 = Class.forName("com.abaojin.Person"); Class c2 = com.abaojin.Person.class; Class c3 = (new com.abaojin.Person()).getClass(); C

什么是反射?

徘徊边缘 提交于 2019-12-14 16:47:11
一、反射的定义 本文基于 JDK8, Oracle官网 对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control. 反射使 Java 代码可以发现有关已加载类的字段,方法和构造函数的信息,并在安全性限制内使用反射对这些字段,方法和构造函数进行操作。 简而言之,指在

Day21——反射

不问归期 提交于 2019-12-14 07:44:04
文章目录 反射 1. 动态语言 2. 静态语言 3. 反射(Reflection): 1. 概述 2. 理解 3. 反射机制提供的功能 4. 反射的优缺点 5. 反射相关的常用 API 6. Class 类 1. 概述 2. Class 的创建方式(获取 Class 类的实例) 3. Class 类常用方法 4. 可以有 Class 对象的类型 5. Java 内存 6. 类的加载过程 1. 类的初始化 2. 类加载器的作用 3. 类加载器的类型 7. 获取运行时类的完整结构 7. Class对象的作用 1. 创建类的对象 2. 创建时需求 3. 对于没有无参构造器的类创建对象 4. 调用指定的方法 8. 性能对比分析 9. 获取泛型信息: 4. 反射操作注解 1. ORM 反射 1. 动态语言 是一类在运行时可以改变其结构的语言:例如细腻的函数、对象、甚至代码可以被引进,已有的函数可以被 删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构; 主要动态语言:Object-C、C#、JavaScript、PHP、Python等; 2. 静态语言 与动态语言相对应,运行时结构不可变的语言就是静态语言。如Java、C、C++; Java不是动态语言,但Java可以称为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性

java反射与代理

为君一笑 提交于 2019-12-14 06:19:37
反射:框架设计的灵魂 一、反射概念 1.1 框架 半成品软件。可以在框架的基础上进行软件开发,简化编码。学习框架并不需要了解反射,但是要是想自己写一个框架,那么就要对反射机制有很深入的了解。 1.2 反射 反射机制:将类的各个组成部分封装为其他对象,这就是反射机制。 反射的好处: 1.可以在程序运行过程中,操作这些对象。 2.可以解耦,提高程序的可扩展性。 Java代码在计算机中经历的三个阶段 (1)Source源代码阶段: .java被编译成 .class字节码文件。 (2)Class类对象阶段: .class字节码文件被类加载器加载进内存,并将其封装成Class对象(用于在内存中描述字节码文件),Class对象将原字节码文件中的成员变量抽取出来封装成数组Field[],将原字节码文件中的构造函数抽取出来封装成数组Construction[],在将成员方法封装成Method[]。当然Class类内不止这三个,还封装了很多,我们常用的就这三个。 (3)RunTime运行时阶段:创建对象的过程new。 二、获取Class对象的方式 2.1 获取Class对象的三种方式对应着java代码在计算机中的三个阶段 (1)【Source源代码阶段】 Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类

如何使用反射调用泛型方法?

倾然丶 夕夏残阳落幕 提交于 2019-12-13 19:41:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 当类型参数在编译时未知,而是在运行时动态获取时,调用通用方法的最佳方法是什么? 考虑以下示例代码-在 Example() 方法内部,使用存储在 myType 变量中的 Type 调用 GenericMethod<T>() 的最简洁方法是什么? public class Sample { public void Example(string typeName) { Type myType = FindType(typeName); // What goes here to call GenericMethod<T>()? GenericMethod<myType>(); // This doesn't work // What changes to call StaticMethod<T>()? Sample.StaticMethod<myType>(); // This also doesn't work } public void GenericMethod<T>() { // ... } public static void StaticMethod<T>() { //... } } #1楼 通过使用 dynamic 类型而不是反射API,可以大大简化使用仅在运行时知道的类型参数的泛型方法的调用。

反射

风流意气都作罢 提交于 2019-12-12 19:57:55
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。 我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗! //1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object // 类型的对象,而我不知道你具体是什么类,用这种方法   Person p1 = new Person();   Class c1 = p1.getClass(); //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 // 这说明任何一个类都有一个隐含的静态成员变量 class   Class c2 = Person.class; //3、通过 Class 对象的 forName() 静态方法来获取,用的最多, // 但可能抛出 ClassNotFoundException 异常   Class c3 = Class

C++ 模拟反射机制

我的梦境 提交于 2019-12-12 01:05:06
本文用C++ 模拟反射机制。 声明一个类时,用类名注册一个打印函数。 打印函数的签名有规则:参数是string, 返回值是void ,函数名时Print+类名。 #include <iostream> #include <map> #include <functional> #include <memory> #include <string> #define FUNC std::function<void(std::string)> class Reflector { private: std::map<std::string, FUNC> _cmdStringMap; static std::shared_ptr<Reflector> ptr; public: void GetPrintFunc(const std::string &str, std::string con) { for (auto & x : _cmdStringMap) { if (x.first == str) x.second(con); } } void Register(const std::string &class_name, FUNC && generator) { _cmdStringMap[class_name] = generator; } static std::shared_ptr