java 反射机制 视频_JAVA反射机制及其原理实现

9.1 概念JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;public、protected、private。

OO(面向对象),private私有的,不能访问。这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。**

反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。

物理:有个反射的概念,通过镜子,可以知道物体的存在。看到一个镜像或名字等,知道物体在哪里。

(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述) 如图是类的正常加载过程:反射的原理在与class对象。 熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

Student.java--->Student.class 经过编译成了一个字节码文件。

802469c9e87234c3030ecaabfc8b76e2.png

9.2 作用在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。

反射是框架设计的灵魂

(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))

9.2.1 反编译:.class-->.java

9.2.2通过反射机制访问java对象的属性,方法,构造方法等;

User user=new User();--》形成的java文件-->XXX.class

将来赋值的时候,不是User类,是不是就报错了啊。存在紧耦合的状态,我们做OO的目的就是高内聚、松耦合,说白了,就是模块内部实现特定功能,模块与模块之间,关联度不大。

这种方式,是编译时

我们以后写程序,更多的应该是运行时给值。

9.3 反射机制的相关类

与Java反射相关的类如下:类名用途Class类代表类的实体,在运行的Java应用程序中表示类和接口

Field类代表类的成员变量(成员变量也称为类的属性)

Method类代表类的方法

Constructor类代表类的构造方法

9.3.1 查看Class类在java中的api

90df67fab54c83fdc9d6afe703f3e547.png

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型) Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

没有公共的构造方法,方法共有64个太多了。下面用到哪个就详解哪个吧

9082163b0f60b48ef937dab9f9753c3c.png

9.3.2 根据一个字符串得到一个类类名方法含义StringgetClass表示此对象运行时类的 Class 对象

ClassforName具有指定名的类的 Class 对象

包装类无属性Type

参考代码:String str="今天是反射课程";         Class clz=str.getClass();//得到当前正在运行的类;         System.out.println(clz);         Class clz2=Integer.TYPE; //包装类型,不同;包装类.Type         System.out.println(clz2);         System.out.println(Boolean.TYPE);         System.out.println(Double.TYPE);         System.out.println(Character.TYPE);

9.3.3 获取Class对象的 三种方式Object:getClass

任何数据类型(包含基本数据类型)都有一个"静态"的class属性,这时候可以通过类名.属性访问.

通过Class类的静态方法:forName(string className路径)

参考代码//1.使用第一种方式来获取User的Class对象;User user=new User(); //弄了一个User对象,在内存里面;Class clz1=user.getClass(); //对象.getClassSystem.out.println(clz1); //clz1:是什么类呢?com.aaa.chapter07.User;路径+类名;//2.使用第二种方式;Class clz2=User.class;      //类名.class 这个静态属性.System.out.println(clz2);//这时候,我们是不是考虑一下,之前讲的那个原理图。证明原理图,里面,正在运行的Class是一个。System.out.println(clz1==clz2);//3.Class.forName(类路径方式)try {Class clz3=Class.forName("com.aaa.chapter07.User");System.out.println(clz3);System.out.println(clz2==clz3);} catch (ClassNotFoundException e) {e.printStackTrace();}

提问?最常用哪种?一般用第三个。松耦合方式。

9.3.4 通过反射来获取构造方法

调用方法:

1.获取构造方法:

1).批量的方法: public Constructor[] getConstructors():所有"公有的"构造方法 public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2).获取单个的方法,并调用: public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法: public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

例如:

调用构造方法: Constructor-->newInstance(Object... initargs)package com.aaa.chapter07;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.sql.Connection;/** * Created by 张晨光 on 2020/3/10 10:24 */public class Constructors {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class clz=Class.forName("com.aaa.chapter07.User");//2.获取所有公共字段;//        Field[] fields = clz.getFields();//        for(Field f:fields){//            System.out.println(f);//        }//2.获取所有共有 私有字段;//        Field[] fields = clz.getDeclaredFields();//        for(Field f:fields){//            System.out.println(f);//        }Field field=clz.getField("country");System.out.println(field);Object obj=clz.getConstructor().newInstance();field.set(obj,"中国");User u=(User)obj;System.out.println(u.getCountry());}}

2、newInstance是 Constructor类的方法(管理构造函数的类) api的解释为: newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用

package com.aaa.chapter07;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;/** * Created by 张晨光 on 2020/3/10 22:29 */public class InstanceDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class clz=Class.forName("com.aaa.chapter07.User");//1.调用第一个默认构造方法,没有参数,创建实例之后,再次使用setter赋值。//        Constructor constructor = clz.getConstructor();//Alt+Enter,//        Object obj=constructor.newInstance();//        User user=(User)obj;//        user.setName("张老师");//        System.out.println(obj);//2.调用第二个有3个参数的构造方法,公共的构造方法,注意里面参数的使用方式.//        Constructor constructor2 = clz.getConstructor(String.class,char.class,Integer.class);//        Object obj2=constructor2.newInstance("张晨光",'男',18);//类似于之前的构造方法,填充值;//        User user2=(User)obj2;//        System.out.println(user2);//3.调用第三个私有构造方法,这个构造方法,我们说外部无法访问.Constructor declaredConstructor = clz.getDeclaredConstructor(String.class);//设置私有构造方法,可以访问,强制(暴力)访问.declaredConstructor.setAccessible(true);Object obj=declaredConstructor.newInstance("登徒子");User user3=(User)obj;System.out.println(user3);}}

9.3.5 获取成员变量并调用

获取成员变量并调用:

1.批量的

1).Field[] getFields():获取所有的"公有字段"

2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;

2.获取单个的:

1).public Field getField(String fieldName):获取某个"公有的"字段;

2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

设置字段的值:

Field --> public void set(Object obj,Object value):

参数说明:

1.obj:要设置的字段所在的对象;

2.value:要为字段设置的值;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python模型的属性是什么_python – Django:为什么Django模型字段的类属性?

不,原因与此相同:>>> class Foo(object):... bar Foo attribute...>>> f Foo()>>> f.barFoo attribute>>> Foo.barFoo attribute>>> f.bar instance attribute>>> f.barinstance attribute>>> F…

java 安卓下载文件_GitHub - Charay/downloadfile: 使用Retrofit2+Rxjava+Rxandroid+okhttp的方式下载文件并存储到sd卡指定目录...

downloadfile使用Retrofit2RxjavaRxandroidokhttp的方式下载文件并存储到sd卡指定目录使用:gradleStep 1.在工程build.gradle文件中加入maven地址repositories:allprojects {repositories {...maven { url https://jitpack.io }}}Step 2. 在module的build.gradle中添…

java map 队列_Java:queue队列,map集合

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口示例代码:1. import java.util.Linke…

java溢出怎么处理_java数据溢出怎么处理?

publicstaticvoidmain(String[]args){//TODO自动生成的方法存根ScannerscnewScanner(System.in);Stringaasc.nextLine();sc.close();floatdn0,xn0,kn0,sn0,qn0;for(inti0;i<a...public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scnew Scanner(S…

java基础 最重要的部分_Java基础(1)最基础的部分

本文章均为自己在自学期间整理的笔记&#xff0c;2020年四月份开始学习Java&#xff0c;如有不足&#xff0c;请补充。希望对各位小伙伴都能有帮助。1.Java中public class和class区别&#xff1a;1)在一个Java文件中可以定义多个class 2)public的class不是必须的 3)public修…

logstash mysql增量_Logstash jdbc 按时间增量更新的一些总结

不同数据库的支持mysql数据类型显示样例是否支持timestampstatementtracking_columntracking_column_typeSQL示例date2020-10-20Nselect *, datediff(date, 1970-01-01) as days from tbl_time where datediff(date, 1970-01-01) > :sql_last_valuedaysnumericselect *, dat…

用java编写奖金税率_企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%_java企业利润提成计算代码...

今天上java课程的时候老师给布置了一个作业&#xff0c;让让java计算一下企业该发放的奖金总额&#xff0c;接下来吾爱编程就为大家介绍一下java实现企业发放的奖金根据利润提成的代码&#xff0c;有需要的小伙伴可以参考一下&#xff1a;1、题目如下&#xff1a;企业发放的奖金…

java 多线程工具_多线程测试工具groboutils的使用

public class FaultServiceTest extends TestCase {/*** param args* throws FaultException* throws ExpParamNotFoundException* throws ParseException*/private IFaultService faultService;private static final int NUM_THREAD 100; // 测试线程总数public FaultService…

java提取多行嵌套div/div内容的正则表达式_提取某一段div标签之间内容的正则表达式怎么写...

满意答案public static void main(String[] args) {String source"\">是大家是否gt;士大夫士大夫";StringBuilder resultnew StringBuilder();System.out.println("开始匹配文字内容");String patternStrs"()(.?)()";Pattern patternPa…

阶乘取模算法java_np问题(大数阶乘取模)

np问题题目描述&#xff1a;LYK 喜欢研究一些比较困难的问题&#xff0c;比如 np 问题。这次它又遇到一个棘手的 np 问题。问题是这个样子的&#xff1a;有两个数 n 和 p&#xff0c;求 n 的阶乘对 p 取模后的结果。LYK 觉得所有 np 问题都是没有多项式复杂度的算法的&#xff…

Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件

/*** 获取1号店生鲜食品的分类id字符串* param filePath* return*/public String getYHDSXCategoryIdStr(String filePath) {final String DELIMITER new String(new byte[]{1});final String INNER_DELIMITER ",";// 遍历目录下的所有文件BufferedReader br null…

python django 表单_Django ModelForm与Form

django表单系统中&#xff0c;所有的表单类都作为django.forms.Form的子类创建&#xff0c;包括ModelForm关于django的表单系统&#xff0c;主要分两种基于django.forms.Form基于django.forms.ModelForm表单API表单有两种状态&#xff0c;绑定&#xff0c;未绑定 Form.is_bound…

java获取2017年第39周_对输入计算机的数据进行审核,可采用()进行审核。A.抽查B.屏幕审核C.凭证清单和屏幕审核D.凭证清单...

参考答案如下对输的数单和薄基底膜肾病主要的遗传方式为A.常染色体显性遗传B.常染色体隐性遗传C.性染色体显性遗传D.性染色儿童的情感发展遵循若干的阶段,比较后出现的是()。A、入计惊讶B、好奇C、恐惧D、哀和乐算机审核智商和情商完全可以分开。()人格不包括以下哪个方面&…

php解析bt,PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解

本文实例讲述了PHP基于闭包思想实现的torrent文件解析工具。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHP对静态词法域的支持有点奇怪&#xff0c;内部匿名函数必须在参数列表后面加上use关键字&#xff0c;显式的说明想要使用哪些外层函数的局部变量。function c…

php excel header,【IT专家】PHP生成excel,方法一-header生成

本文由我司收集整编&#xff0c;推荐下载&#xff0c;如有疑问&#xff0c;请与我司联系PHP生成excel&#xff0c;方法一:header生成2018/02/09 444 public function export_order() { //搜索条件$where ‘where 11 ‘; $consignee I(‘consignee’); if($consignee){ $where…

discuz php源码,Discuz7 php源码,该如何解决

PHP code$_value) { $_key{0} ! _ && $$_key daddslashes($_value);}}//过滤$_FILES,也就是添加引用if (!MAGIC_QUOTES_GPC && $_FILES) {$_FILES daddslashes($_FILES);}//初始化一些变量$charset $dbs $dbcharset $forumfounders $metakeywords $extr…

php显示html表单内容,HTML表单是什么?HTML表单内容的详细介绍(附代码)

HTML 表单是用于搜集不同类型的用户输入的&#xff0c;表单是一个包含表单元素的区域&#xff1b;表单元素是允许用户在表单中(比如&#xff1a;文本域、下拉列表、单选框、复选框等等)输入信息的元素&#xff1b;表单使用表单标签()定义。一、介绍1.表单概念&#xff1a;表单最…

matlab分数约分,分母

3.10c语言自学2021-03-10 19:51:18https://s4.51cto.com/images/blog/202103/10/489602174c3d2e1deb2f94bc7944366c.png?x-oss-processimage/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk)term-termxx/(n(…

php中metadata,模型元数据(Models Metadata)

To speed up development Phalcon\Mvc\Model helps you to query fields and constraints from tables related to models. To achieve this, Phalcon\Mvc\Model\MetaData is available to manage and cache table metadata.Phalcon\Mvc\Model 能帮助你查询字段从表关联到模型和…

matlab函数冒号代表的意思,MATLAB中冒号运算符的含义

实际上a&#xff1a;b生成一个向量.您可以仅将其用作索引,因为(…)也接受列表,例如octave-3.0.3:10> a [1,4,7]a 1 4 7octave-3.0.3:11> b [1,4,9,16,25,36,49]b 1 4 9 16 25 36 49octave-3.0.3:12> b(a) # gets [b(1), b(4), b(7)]ans 1 16 49现在,a&#xff1a;b&…