反射机制

java基础加强--反射

余生长醉 提交于 2020-04-07 09:14:33
笔记摘要: 这里主要介绍了java类中的反射技术,其主要是应用在框架中,这里通过介绍和反射相关的几个类:Constructor、Filed、Method类 来 对 它们各自 的反射方式和应用进行了说明,另外还有数组的反射,同时对HashCode和HashSet集合进行了更深层次的理解,其中的 HashSet 集合中出现的内 存泄露问题是值得我们注意的。 一、反射的基石::Class类 Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 1. Class类的各个实例对象: 对应各个类在内存中的字节码,例如Person类的字节码等 2. 字节码: 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们 在内存中的内容是不同的,这一 个个空间可以分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型 3. 获取各个字节码对应的实例对象(Class类型)的方法 1> 静态方法,类名.class, 例如System.class Class cls = Person.class ; 2> 用字节码产生的对象获取 getClass(), 例如:new Date( ).getClass 3> Class.forName("类名"); 这种方式可以不用知道原来的类名

JavaSE——反射机制

纵然是瞬间 提交于 2020-04-06 13:53:13
1、反射是什么? 2、通过反射获取类的Class对象 3、什么时候会发生类的初始化 4、类加载器 5、反射的一些方法 6、通过反射获取类的运行时结构 1、反射是什么? 动态语言在程序运行时可改变其结构,反射是java被视为动态语言的关键。 2、通过反射获取类的Class对象 2.1、 Class c1 = Class.forName ("包名+类名") ; 2.2、 Class c2 =对象.getClass(); . 2.3、 Class c3 =类名.class; 注意: 1.一个类在内存中只有一个Class对象 2.一个类被加载后,类的整个结构都会封装在Class对象中。 3、什么时候会发生类的初始化 3.1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类 new一个类的对象时 调用类的静态成员(除了final常量)和静态方法 通过反射调用时(使用java.lang.reflect包的方 法对类进行反射调用) 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 3.2、类的被动引用(不会发生类的初始化) 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了) 4

黑马程序员_张孝祥反射详解

喜欢而已 提交于 2020-04-06 08:34:31
------- android培训 、 java培训 、期待与您交流! ---------- 反射: *反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。 一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。 Constructor类代表某个类中的一个构造方法 得到某个类的所有构造方法: Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors(); 得到某一构造方法: Constructor constructor = Class.forName(“java.lang.String”).getConstructors(StringBuffer.class); //获得方法时要用到的类型

11-java学习笔记-反射

强颜欢笑 提交于 2020-04-06 08:03:08
1.反射的应用场景 一、概述 反射技术: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 二、应用场景 一个已经可以使用的应用程序,因为程序已经做好可以运行使用,不能再进行代码的加入了。而当后期我们新的功能加入程序时,该怎么做呢?就如我们的电脑一样,后期我们可能会鼠标、键盘等,所以电脑给我们预留了usb接口,只要符合这个接口规则的设备,电脑就可以通过加载驱动等操作来使用。 那这个程序能用了,如何使用后期出现的功能类呢? 常用的作法,会提供一个配置文件,来供以后实现此程序的类来扩展功能。对外提供配置文件,让后期出现的子类直接将类名字配置到配置文件中即可。该应用程序直接读取配置文件中的内容。并查找和给定名称相同的类文件。进行如下操作: 1)加载这个类。 2)创建该类的对象。 3)调用该类中的内容。 应用程序使用的类不确定时,可以通过提供配置文件,让使用者将具体的子类存储到配置文件中。然后该程序通过反射技术,对指定的类进行内容的获取。 好处:反射技术大大提高了程序的扩展性。 2. 反射的基石-Class类 对比提问: Person类代表人,它的实例对象就是张三,李四这样一个个具体的人,

java反射机制

荒凉一梦 提交于 2020-04-06 07:14:50
在学习java反射机制前我们需要对 java.lang.Class<T> 这个类有较为清楚的认识。   Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型( boolean 、 byte 、 char 、 short 、 int 、 long 、 float 和 double )和关键字 void 也表示为 Class 对象。   Class 没有公共构造方法。 Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 来源: https://www.cnblogs.com/yangwei20160911/p/5866892.html

java-反射

帅比萌擦擦* 提交于 2020-04-06 07:01:04
反射:在运行时期,通过反射可以动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 类的加载过程(加载机制):   1. 编码   2. 类的加载器去加载(将字节码文件加载到JVM中,给每个类创建字节码对象)   3. 初始化   4. 运行期 1. Class实例 其实就是一些类型(类 接口 数组 基本数据类型 void)的字节码对象 Class 类的实例表示正在运行的 Java 应用程序中的类和接口(字节码对象); 枚举是一种类,注释(指的是注解Annotation)是一种接口; 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象; 基本的 Java 类型( boolean 、 byte 、 char 、 short 、 int 、 long 、 float 和 double )和关键字 void 也表示为 Class 对象;    注意 :   1 、 Class 类 和它的实例的产生: Class 的实例是已经存在的类型, 所以不能够直接 new 一个 Class 对象出来 ,而通过已知的类型和 Class 来获得   2 、同一种类型不管通过什么方式得到 Class 的实例都是相等的; 一个类型的字节码对象只有一份 !     线程同步:同步监听对象 字节码对象来充当同步监听

Java 反射机制

隐身守侯 提交于 2020-04-06 05:57:25
根据李兴华的视频整理的 大致是先得到Class的类的对象,然后在用这个对象调用newInstance方法创建实例,就可以对实例进行操作了 Java反射的源头是Class这个类: public final class Class<T>extends Objectimplements Serializable, GenericDeclaration, Type, AnnotatedElement Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型( boolean 、 byte 、 char 、 short 、 int 、 long 、 float 和 double )和关键字 void 也表示为 Class 对象。 Class 没有公共构造方法 。 Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 以下示例使用 Class 对象来显示对象的类名: void printClassName(Object obj) { System.out.println("The class of " + obj + " is " + obj.getClass()

黑马程序员_java总结_反射

半腔热情 提交于 2020-04-06 03:56:03
----------- android培训 、 java培训 、java学习型技术博客、期待与您交流! ------------ 现在总结反射机制,个人感觉反射在JAVA中是相当重要的.我让为的反射:在java中执行一个 程序之前会先把其编译成class文件,而反射就是在运行时把已有的class文件进行反编 译的并在这个过程中,把类中的所有元素转换成JAVA中的类的一个过程,因为一个Class 文件就相当于一个类,那么反射就是以类为单位进行操作的了.对于反射的内容包括以下 几点: 1.类的字节码(Class) 2.反射时的构造方法. 3.反射时的普通方法. 4.反射时的成员变量. 1.类的字节码(Class) 要想实现反射,在JAVA中就必须借助与Class类,它是反射的基础.每一个类在编译时 都会被编译成.class 文件.而在运行时,JVM会把这些要用到的文件加载到内存中, 这时这些文件就是以一段段的字节码的形式表示的,而这些字节码也被java封装成了 一个对象,这个对象就是Class,而java中 实现反射就是以一个Class为单位操作的, 所以要实现反射就必须先有这么一个对象了.要想得到Class类的实例有三种方式: 1.类名.class;如: Class clazz = String.class; 2.调用Class类的静态方式forName方法,它有几个重载形式

反射机制-动态获取属性值

≯℡__Kan透↙ 提交于 2020-04-05 22:59:32
public class reflectDemo { public static void main(String[] args) throws Exception { Scanner in = new Scanner(System.in);//-------------------------提醒用户输入 System.out.println("请输入类名(全路径:package.className)"); String cname=in.nextLine(); System.out.println("属性名"); String fname=in.nextLine(); Class cla = Class.forName(cname);//----------------------------动态加载类 Field fil = cla.getDeclaredField(fname);//---------------------动态获取属性 Object obj = cla.newInstance();//------------------------------动态创建对象 Object val = fil.get(obj);//-----------------------------------获取查询属性的值 System.out.println("查询的属性值为:"

Java的类反射机制(Java高级)

喜夏-厌秋 提交于 2020-04-05 15:14:17
思维导图 概述 为什么要用反射:任意调用类中的私有内容,使类的使用更加灵活。 反射:针对性地映射 某一个完整事务的行为或特征(单独操作类中任意内容) 1、反射机制 - 获取对象 什么是类对象? 类对象,就是用于描述这种类,都有什么属性,什么方法。 对象之前的区别? gareen 和 teemo都是 Hero对象,他们的区别在于:各自有不同的名称、血量、技能。 类之间的区别? Hero 和 soldier 都是类,他们的区别在于有:不同的方法,不同的属性。 获取类对象的3种方式 Class.forName Hero.class new Hero().getClass() package reflection; import charactor.Hero; public class TestReflection { public static void main(String[] args) { String className = "charactor.Hero"; try { Class pClass1=Class.forName(className); Class pClass2=Hero.class; Class pClass3=new Hero().getClass(); System.out.println(pClass1==pClass2); System.out