成员变量

反射机制

瘦欲@ 提交于 2020-01-10 14:59:33
1 反射的概述 1.1 什么是反射 每个.class文件被加载到内存后都是一个Class类的对象!例如Demo.class加载到内存后它是Class<Demo>类型的一个对象。 反射就是通过Class对象获取类型相关的信息。一个Class对象就表示一个.class文件,可以通过Class对象获取这个类的构造器、方法,以及成员变量等。 反射是Java的高级特性,在框架中大量被使用!我们必须要了解反射,不然无法学好JavaWeb相关的知识! 1.2 反射相关类 与反射相关的类: l Class:表示类; l Field:表示成员变量; l Method:表示方法; l Constructor:表示构造器。 2 Class类 2.1 获取Class类 获取Class类的三种基本方式: l 通过类名称.class,对基本类型也支持; Class c = int.class; Class c = int[].class; Class c = String.class l 通过对象.getClass()方法 Class c = obj.getClass(); l Class.forName()通过类名称加载类,这种方法只要有类名称就可以得到Class; Class c = Class.forName(“cn.itcast.Demo”); 2.2 Class类的常用方法 l String

三十二、JavaSE之反射(这个部分很重要)

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

静态变量与成员变量之间的区别

亡梦爱人 提交于 2020-01-09 23:19:05
静态变量与成员变量之间的区别 1、成员变量包含在对象之中。每个对象都有自己独立的成员变量,当一个对象的成员变量发生变化时,不会影响另外的对象。而静态变量独立在对象之外,所有对象共享静态变量,但是,静态变量的改变也会影响所有的对象; 2、静态变量在类加载时创建,他是在对象将之前的,它常驻内存,不会因为对象的产生或者销毁而发生变化;而成员变量会随着对象的产生而产生,销毁而销毁; 3、存放地址:静态变量存放在数据段中,而成员变量跟随对象会放在对空间中; 4、访问方式:成员变量只能通过对象名点的方式来访问;而静态变量可以通过对象点或者类名点的方式访问; 构造器:---构造方法也叫构造器或者构造函数----但是java的构造器不是函数,所以不能被继承 1、使用构造类的newInstance方法可以调拥有参的和私有的构造方法-----创建对象 2、构造器可以重载: 方法名相同,参数不同 构造器(创建)的执行顺序 1、父类静态常量 2、父类静态初始化块 3、子类静态常量 4、子类静态初始化块 5、父类初始化块 6、父类构造器 7、子类初始化块 8、子类构造器 来源: https://www.cnblogs.com/wanggang1987/p/12173877.html

[C++]C++面试知识总结

只谈情不闲聊 提交于 2020-01-08 23:40:04
1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS段:存放未初始化的static变量和全局变量 Data段:存放初始化过的static变量和全局变量 Text段:存储程序的二进制代码,程序代码区。   堆:程序运行时通过malloc申请的内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。 栈:执行函数时,函数的局部变量存储在栈中,执行结束后自动释放该内存区域,栈内存分配运算内置与处理器指令集中。 C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区。 1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 堆溢出:程序申请了资源但忘记释放该资源,造成内存泄露,累积泄露内存过多会造成内存溢出。 1.3 内存泄露和检测 C++内存泄漏检测内存泄露是指程序中动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。 动态内存泄露检测:检查new

设计模式之——原型模式(克隆模式)

浪子不回头ぞ 提交于 2020-01-08 20:45:32
一、基本介绍 原型模式(创建型):用一个已经创建好的对象作为原型,通过复制该原型对象创建出相同或相似的对象。 二、包含角色 1.抽象原型类:规定了具体原型对象必须实现的接口。 2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 三、案例及UML类图 案例说明: 当做试卷的时候,我们需要抄别人的试卷,则需要复制对原来的试卷进行复制操作。 UML类图: 方式一:浅克隆 类TestPaper1: public class TestPaper1 implements Cloneable{ private String name; private int clazz; private String content; private Integer rank; private Date date; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getClazz() { return clazz; } public void setClazz(int clazz) { this.clazz = clazz; } public String getContent() { return content; }

Java反射机制

☆樱花仙子☆ 提交于 2020-01-08 18:33:45
所谓反射,就是能够让运行于JVM中的程序检测和修改运行时的行为。 而Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义。 主要的反射类 Constructor 类的构造函数反射类,会通过Class#getConstructor()方法获取类的构造函数反射对象;Constructor类的主要方法是newInstance(Object[] initargs),通过这个方法可以创建一个类的实例。 Method 类方法的反射类,通过Class#getDeclaredMethods()方法获取类的所有方法反射类对象的数组,或者是通过getDeclaredMethods(String name)来获取特定方法的反射类对象。Method类的一个主要方法是invoke(Object obj,Object[] args),其中obj是操作的目标对象,args是方法的入参,通过这个方法可以获取到具体实例对象的具体方法。 Filed 类的成员变量的反射类,通过Class#getDeclaredFieldsO方法可以获取类的成员变量反射对象数组,通过Class#getDeclaredField(String name

Java反射基础

*爱你&永不变心* 提交于 2020-01-08 04:21:29
Java反射机制定义   Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。 反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 优点 可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。 缺点 对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

Java中的反射

≯℡__Kan透↙ 提交于 2020-01-06 22:03:56
反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 Apple apple = new Apple ( ) ; //直接初始化,「正射」 apple . setPrice ( 4 ) ; 类加载器 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 获取Class对象的三种方式: 1.通过类名获取 类名.class 2.通过对象获取 对象名.getClass() 3.通过全类名获取 Class.forName(全类名) 一个类在加载过程中的三部曲: 1.加载 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象。 2.连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 3.初始化 系统给出的默认值 类的加载时机(重点) 创建类的实例 访问类的静态变量,或者为静态变量赋值 调用类的静态方法 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java

C++对象指针—指向对象成员的指针

心已入冬 提交于 2020-01-05 04:25:06
对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。 1、指向对象数据成员的指针定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。 例如 int *p1; //定义指向整型数据的指针变量 定义指向对象数据成员的指针变量的一般形式为数据类型名 *指针变量名;如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。 p1=&t1.hour;//将对象t1的数据成员hour的地址赋给p1,p1指向t1.hour cout<<*p1<<endl;//输出t1.hour的值 2、指向对象成员函数的指针需要提醒读者注意: 定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。 成员函数与普通函数有一个最根本的区别: 它是类中的一个成员。编译系统要求在上面的赋值语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在以下3方面都要匹配: ①函数参数的类型和参数个数; ②函数返回值的类型; ③所属的类。 定义指向成员函数的指针变量应该采用下面的形式: void (Time::*p2)( );//定义p2为指向Time类中公用成员函数的指针变量 定义指向公用成员函数的指针变量的一般形式为 数据类型名

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一