java反射机制

什么是反射?

在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。java通常是先有类再有对象,有对象就可以调用方法或者属性,java中的反射其实是通过Class对象来调用类里面的方法。
反射的功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。如eclipse中,一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。

反射常用类:

1.Class枚举类
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

     Person p = new Person();//获取class对象的方式1// 需要依赖Class clazz = p.getClass();// 方式2 在编译之前就知道要操作的class的名称是什么Class clacc = Person.class;Class clazz = Class.forName("com.openlab.test.Person");Constructor[] con = clazz.getConstructors();Method[] methods = clazz.getDeclaredMethods();Field[] fields = clazz.getDeclaredFields();System.out.println(con.length);System.out.println(methods.length);System.out.println(fields.length);



2.Constructor构造器
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。Constructor 允许在将实参与带有基础构造方法的形参的 newInstance() 匹配时进行扩展转换,但是如果发生收缩转换,则抛出 IllegalArgumentException。

3.Method方法类
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
Method 允许在匹配要调用的实参与基础方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。


4.Field变量类
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException。

反射运行指示图


通常情况下我们只能在编写源代码时能够清楚的了解到对象的相关属性和方法,常常这些方法是被固定的,程序进入编译之后变不能更改的,但是java加入了反射机制,便可以做到编译之后还能对程序做出更改。

通过反射获取对象

package com.openlab.test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test {public static void main(String[] args) {//       Person p = new Person();
//      //获取class对象的方式1
//      // 需要依赖
//      Class clazz = p.getClass();
//      // 方式2 在编译之前就知道要操作的class的名称是什么
//      Class clacc = Person.class;
//
//      Constructor[] con = clazz.getConstructors();
//      Method[] methods = clazz.getDeclaredMethods();
//      Field[] fields = clazz.getDeclaredFields();
//
//      System.out.println(con.length);
//      System.out.println(methods.length);
//      System.out.println(fields.length);// 方式3 常用Class clazz;try {clazz = Class.forName("com.openlab.test.Person");Constructor con = clazz.getDeclaredConstructor(new Class[]{String.class,int.class});con.setAccessible(true);Person p = (Person) con.newInstance(new Object[]{"张三疯",99});System.out.println(p);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}//      Person p = (Person) clazz.newInstance();}}

那么为什么要使用这种方式来创建对象呢,原因很简单,使用反射来创建对象,最直接的原因就是因为,在写底层代码的时候,程序员对于要创建的对象有很多的不确定性,而正常的创建对象需要知道类名,而很多使用在使用反射的创建对象时,都是只给了个泛型,所以在不确定类型的情况下创建对象是反射独有的功能。

java反射机制的概念及原理相关推荐

  1. Java反射机制基本概念与相关Class类对反射机制的实现

    Java反射机制 1.何为反射 2.反射作用 3.Class类实例化应用 3.1.进行Class类对象的实例化的三种方式 3.2.Class类实例化其他类对象的两种方式 3.2.1.调用newInst ...

  2. Java 反射机制和动态代理是基于什么原理,了解过吗?

    工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1."知其然不知其所以然". 做了多年技术,开发了 ...

  3. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...

    先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对 ...

  4. JAVA反射机制及其原理实现

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

  5. java反射机制原理,为什么需要反射,反射的作用

    最近在学java反射以及动态代理,好多博客都写的十分官方.就自己整合些资料.加深java反射机制的理解. 在说反射之前,我们要先了解动态语言和静态语言的概念: 动态类型语言 所谓动态类型语言,就是类型 ...

  6. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  7. java反射机制原理详解_java反射机制的详细讲解

    一 , 什么是java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...

  8. Java反射机制01_反射的概念以及获取字节码信息 的四种方式

    Java反射机制01-反射的概念以及获取字节码信息 的四种方式 一.反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象, 都能够调用它的任意 ...

  9. Java反射机制概念及应用场景

    Java反射机制概念及应用场景 Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机 ...

最新文章

  1. Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
  2. 微服务注册中心的选型和思考
  3. io多路复用的原理和实现_彻底理解 IO 多路复用实现机制
  4. MFC应用技术之CTreeControl的使用
  5. 火狐浏览器pentadatyl插件的基本设置
  6. java状态机设计模式_设计模式总结-State模式
  7. matlab 高分屏 变小,解决Ubuntu高分屏下matlab标题栏(菜单栏)字体过小问题
  8. java字符串数组排序_在Java中对字符串数组进行排序
  9. 【转】shell十三问,为linux学习打基础(上)
  10. windows performance
  11. iOS核心动画Core Animation(一)
  12. 种一棵树最好的时间是十年前,其次是现在。
  13. 计算机win10+上锁,手把手教你在windows 10右键菜单中添加Bitlocker上锁/解锁教程-网络教程与技术 -亦是美网络...
  14. php开发h5游戏教程,HTML5游戏框架cnGameJS开发实录-实现动画原理
  15. 小米开源:站在巨人肩膀上的创新
  16. NUBT 1480 懒惰的风纪委Elaine
  17. STM32 控制蜂鸣器播放音乐的原理和实例
  18. php时间转换位周月,php日周月统计代码
  19. 有了AI智能绘画,我也可以成为绘画大师——全球最大规模中文跨模态生成模型ERNIE-ViLG
  20. 《Redis设计与实现》第十一章 AOF持久化

热门文章

  1. 【攻防世界 level2】
  2. Python Selenium3.141+Win7(64位)+IEDriverServer(32位版本)+调用IE11卡死的解决
  3. Scrapy去重操作
  4. C++中的堆内存、栈内存和静态内存
  5. XCTF---MISC---来自银河的信号
  6. 爬虫实战教程:采集微信公众号文章
  7. html表格字间距怎么调整,word表格中怎么调整文字行间距以及字符间距?
  8. 为什么架构师工资比运维高?
  9. spark中的cache()、persist()和checkpoint()的区别
  10. 经典排序算法-----归并排序(C语言实现)