java的灵魂——反射

前言:
当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象
上,相同的类只有一个类模板对象。
连接:把类的二进制数据合并到JRE中

反射
运行时探究和使用编译时未知的类
原理:JVM在加载一个类的时候,会把该类的信息存放到一个class对象中,该对象又称为类模板对象,
JVM可以通过检索该对象,得到这个类所拥有的各种信息(名字、所在包、父类、实现接口……)JDK提供
API,允许程序员获取到类的class对象,导致程序员也可以检索到这个类的这些信息,即便这个类不是这个
程序/程序员所实现的。

操作三步骤:获取到class对象、探究类的信息、使用探究到的类的信息

一、获取class对象
1、通过类型名获取class对象(类、接口、数组、基本数据类型、返回类型……)
Class stuClass=StudentBean.class;
Class intClass = Integer.TYPE; JDK1.5之前使用包装类来获取基本数据类型对象
Class intClass = int.class; JDK1.5之后可以直接获取。
所有的类型都可以获取到class对象,没有动态性,在编写代码时已经知道类型名。

2、通过实例对象获取class对象
StudentBean stu = new StudentBean();
Class stuCladd = stu.getClass();
只有能产生实例化对象的类型可以通过该方法获取到class对象,包括:非抽象类、数组类型
因为在编写代码时已经得到实例对象,不具有动态性。

3、通过类型名的字符串形式获取class对象
Class stuClass=Class.forName("类全名");
类和接口可以通过该方式获取class对象,细节:必须填写全类名、先主动完成加载,然后返回class对象
这是唯一一种动态性的体现,以后会大量使用,表现在各种框架中抒写配置文件。

二、通过class对象探究类的信息
1、探究属性——field
探究所有公共属性——stuClass.getFields();探究所有公共的属性、包括从父类继承而来的
探究所有已声明属性——stuClass.getDeclaredFields();探究所有本类声明的属性,不包括从父类继承的
探究指定公共属性——stuClass.getFields("");探究指定公共属性,包括父类的
探究指定声明属性——stuClass.getDeclaredField("");探究指定本类声明的属性,不包括父类的
2、探究构造——constructor
同上
3、探究方法——method
同上
三、使用class对象探究的信息
1、探究到constructor,就可以产生实例对象
newInstance(参数,参数)
2、探究到method,就可以调用方法
invoke(对象,参数)
3、探究到field,就可以赋值、取值
set(对象,参数) get(对象)
在使用探究到的信息,有一些细节:
1、第三种产生对象的方式
2、在反射产生实例对象时,可以直接调用class对象的newInstace方法获取到实例对象,但它只能
调用公共无参构造,这就是JavaBean的第一规范的原因
3、私有属性在反射中操作,都是调用它的公共的set、get方法,这就是JavaBean的第二规范的原因——常用
4、反射是Java的底层实现,其实是可以破坏封装直接操作任意访问修饰符的构造、方法、属性
setAccessible(true) 设置可访为true(构造、属性、方法)——慎用

时间: 2024-10-12 17:29:18

java的灵魂——反射的相关文章

Java基础之—反射

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对

【转】Java基础之—反射

本文章来源:https://blog.csdn.net/sinat_38259539/article/details/71799078.感谢敬业的小码哥的总结. 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反

Java基础之反射

Java反射是指运行时获取类信息,进而在运行时动态构造对象.调用对象方法及修改对象属性的机制.百度百科的定义:“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 一.反射的用途 Java的反射机制可以做3件事:运行时创建对象.运行时调用方法.运行时读写属性.进而实现以下功能:调用一些私有方法,实现黑科技.比如双卡短信发送.设置状态栏颜色.自动挂电

第16篇-JAVA 类加载与反射

第16篇-JAVA 类加载与反射 每篇一句 :敢于弯曲,是为了更坚定的站立 初学心得: 追求远中的欢声笑语,追求远中的结伴同行 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-12| JAVA 类加载与反射 ] 1.类加载 类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载.连接.初始化三个步骤来对该类进行初始化,如果没

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

java中的反射

一.什么是反射 简单来说,java反射机制其实就是I/O流的一种封装版,用来快速读取硬盘上的class文件.class文件相当于一个身份证,JVM在操作某一个对象时,需要根据身份证获得对象拥有的属性和拥有的功能及方法.这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制. 二.官方提供的反射机制API: class文件: java.lang.reflect.Class类:描述内存中class文件 属性(数据存储单位): java.lang.reflect.Field类:描述内存

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(1)

java学习一段时间之后,大家可能经常会听到反射这个词,那么说明java已经学习到一个高一点的层次了.接下来我会一步步和大家一起揭开java高级特性反射的神秘面纱. 首先介绍下类对象这个概念,可能会经常用到这个概念: 类对象:java中有句很经典的话"万事万物皆对象",相信大家都不陌生,这句话告诉了我们java的特征之一,那就是面向对象.java中类的概念我们都很熟悉,既然万事万物皆是对象,那么类是谁的对象呢?<对象的概念:一个类的实例>换句话说,类是谁的实例.如此就有了类

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr