Java的反射机制一起来看看

目录
  • 一、什么是反射机制?
    • 获得Class类对象的三种方式:
  • 二、Class类
  • 三、Package类
  • 四、Field类
  • 五、Method类
  • 六、Constructor类
  • 总结

一、什么是反射机制?

反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;

获得Class类对象的三种方式:

方式一 :Class.forName(“类名”);

Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。

Class cls = Class.forName("com.oracle.vo.Person");

方式二: 类名.class

要求运行的类库一定要有Person类

//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型
//会为每个类定义一个属性,存储自己类的类对象
Class cls = Person.class;

方式三: 对象.getClass()

要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象

Person p = new Person();
//getClass方法是Object类的方法,所有的对象都有getClass方法
Class cls = p.getClass();

二、Class类

API方法

1. getName() 获得类对象对应类的类名(全类名:包名+类名)

2. getSimpleName() 获得类对象对应类的类名

3. getPackage() 获得类对象对应类的包对象

try {
    Class cls = Class.forName("com.oracle.vo.Person");
    System.out.println(cls.getName());
    System.out.println(cls.getSimpleName());
    Package page = cls.getPackage();
    System.out.println(page.getName());
    } catch (ClassNotFoundException e) {

    e.printStackTrace();
}

4. getField(String name) 根据名字获得能访问的属性。

5. getDeclaredField(String name) 根据名字获得属性。

6. getDeclaredFields() 获得所有的属性

7. getDeclaredMethod()

8. getDeclaredConstructor(Class... types) 根据参数列表获得构造器

9. newInstance() 通过无参构造器创建对象

10. getSuperClass() 获得父类的类对象

三、Package类

Package对象抽象为包

四、Field类

是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。

获得属性对象,主要的作用是对属性进行赋值或取值的操作。

1. get(Object obj) 返回Object :获得某个对象的属性值。

2. setAccessible(boolean flag) : 设置属性是否可访问。

3. set(Object obj,Object value) : 设置属性值

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类中所有的属性
            Field[] fields = cls.getFields();
            //获得Person类中的name属性
            Field field = cls.getDeclaredField("name");
            System.out.println(field.getName());
            //获得 某个Person对象 的name属性值
            //field: Person类的name属性
            //设置这个属性可访问,忽略修饰范围
            field.setAccessible(true);
            //设置p对象的name属性值 为jack
            field.set(p, "jack");
            System.out.println(field.get(p));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

五、Method类

invoke(Object obj, Object ... args) 返回Object : 执行method方法

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类的 method(String name) 方法对象
            Method method1 = cls.getDeclaredMethod("method", String.class);
            //获得Person类的 method() 方法对象
            Method method2 = cls.getDeclaredMethod("method");
            //method(int i,String name) 方法对象
            Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
            //获得全部方法
            Method[] methods = cls.getDeclaredMethods();
            //获得方法要作什么? 就是要调用方法
            //obj参数: 调用哪个对象的方法
            method1.invoke(p, "abc");
            System.out.println(method3.invoke(p, 10,"abcd"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

六、Constructor类

newInstance(Object ... args) 调用构造器创建对象

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得 public Person() 构造器
            Constructor constructor1 = cls.getDeclaredConstructor();
            //public Person(String name, int age) 构造器
            Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
            //获得构造器的作用,要调用构造器创建对象
            Object obj1 = constructor1.newInstance();
            Object obj2 = constructor2.newInstance("tom",20);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java基础篇之反射机制详解

    目录 1.反射概述 1.1什么是反射 1.2.反射能干什么 2.解剖类 2.1反射构造方法 2.1.1反射无参的构造函数 2.1.2反射“一个参数”的构造函数 2.1.3反射“多个参数”的构造函数 2.1.4反射“私有”的构造函数 2.1.5反射得到类中所有的构造函数 2.2反射类中的方法 2.3反射类中的属性字段 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? Java中创建对象大概有这几种方式: 1.使用new关键字:这是我们最常见的也是最简单的创建对象的方式

  • Java反射机制,如何将一个实体类所有字段赋值为null

    目录 将一个实体类所有字段赋值为null 起因 第一种方法 第二种方法 将实体类中的null属性置为““或者空值 工具类 测试类 先创建需要的实体 将一个实体类所有字段赋值为null 起因 在我们想要使用一个实体类的时候,如果发现创建这个类的时候,给某一些字段设置了初始值(某些场景下的特殊需要),但我们这个时候又不需要这些初始化值的时候,我们就会想要把这些值全部清除掉,让其变为一个干净的类,我们可以手动一个一个去赋null值,我一开始就是这么做的,同事看到后告诉我,你可以尝试使用反射机制,自己封

  • Java十分钟精通反射机制原理

    什么是反射? 反射机制是在运行状态中,它为Java提供一种"操作对象"的能力,在运行状态下,通过Class文件对象,可以调用到任何类里面的属性.方法.以及构造方法,包括私有的,所有的类在反射机制面前都是透明的 自己的概括:通过Class文件对象可以看到这个类里面的所有东西,并且可以使用和修改 反射的前提是获取Class文件对象((字节码对象),那么一共有三种方式获取: Class.forName("全类名") ----通过Class类的静态方法(最常用) 类名.cl

  • Java实例讲解反射机制是怎么一回事

    Java反射机制的概述 1.Java的反射(reflection) :机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法.这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制.反射被视为动态语言的关键,反射让Java成为一个准动态语言 .缺点增加不安全性. 2.动态语言(弱类型语言) 是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型..

  • JAVA的反射机制你了解多少

    目录 1.什么是反射? 2.反射能够干什么? 3.反射相关API 4.Class类的理解 (1).介绍: (2).类的加载过程: ①加载: ②链接: ③初始化 ④使用 ⑤卸载 (3)类加载器 总结 1.什么是反射? 在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一. 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的. Reflectio

  • Java中的反射机制示例详解

    目录 反射 什么是Class类 获取Class实例的三种方式 通过反射创建类对象 通过反射获取类属性.方法.构造器 更改访问权限和实例赋值 运用场景 反射 反射就是把Java类中的各个成分映射成一个个的Java对象.即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法:对于任意一个对象,都能调用它的任意一个方法和属性.这种动态获取信息及动态调用对象方法的功能叫Java的反射机制 每一个Java程序执行必须通过编译.加载.链接和初始化四个阶段 1.编译:将.java.文件编译成字节码.

  • Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

  • Java的反射机制---动态调用对象的简单方法

    唉!我还真是在面试中学习新东东啊,一个公司刚刚给了个测试,不过我很奇怪的是为什么web developer的职位居然考java的反射机制题,不过学习研究一下反射机制对我来说是件好事啦! 先说说什么是java反射机制吧,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对 象:在运行时判断任意一个

  • 简单总结Java的反射机制的运用

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 简单来说,一个类或者一个对象是拥有下面几种属性的: Method,Constructor,Field,其大致结构类图如下: 我们现在用代码来说明问题: 首先,我们看Class类,在Class类中,我们可以看见下面的几个重要的方法: getInterfaces() getSuperClass(); isInterface(); 这是用来得到一个类的接口或者超类,以及判断这个类是不是一个接口:

  • 详解java中反射机制(含数组参数)

    详解java中反射机制(含数组参数) java的反射是我一直非常喜欢的地方,因为有了这个,可以让程序的灵活性大大的增加,同时通用性也提高了很多.反射原理什么的,我就不想做过大介绍了,网上一搜,就一大把.(下面我是只附录介绍下) Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等).superclass(例如O

  • Java基础--反射机制

    反射 反射可以使我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码链接.反射允许我们在编写和执行时,使我们的代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码. 反射机制作用 反编译:.class -> .java 通过反射机制访问Java对象的属性,方法,构造方法 反射的使用 反射机制获取类的三种方式 Class c1 = Class.forName("com.webb.basis.reflect.Demo"); // 一般采

  • Java编程反射机制用法入门与实例总结

    本文实例讲述了Java编程反射机制用法.分享给大家供大家参考,具体如下: 前言:反射:动态获取类 (字节码文件 如本篇中的Person.class),并对其成员进行运行.反射在Android应用层的开发中可能遇到会稍微少一点,但对于想打通底层的小伙伴来说,必须要熟练掌握运用. 实体类 Person.java package com.sunwenou.reflect;// 包名 public class Person { private String name; private int age;

  • Java基于反射机制实现全部注解获取的方法示例

    本文实例讲述了Java基于反射机制实现全部注解获取的方法.分享给大家供大家参考,具体如下: 一 代码 class Info{ //给mytoString方法加了2个内建Annotation @Deprecated @SuppressWarnings(value = "This is a waring!") public String mytoString(){ return "hello world"; } } class GetAnnotations{ publi

  • Java中反射机制和作用详解

    前言 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象. 那么接下来大师就带你们了解一下反射是什么,为什么要学习反射? 下面我们首先通过一个实例来说明反射的好处: 方法1.不用反射技术,创建用户对象,调用sayHello方法 1.1 我们首先创建一个User类 package com.dashi; /** * Author:Java大师 * User对象,包含用户的id和姓名以及sayHello方法 */ public

  • Java开发反射机制的实战经验总结

    目录 前言 一.创建Class的三种方式 二.反射获取类的所有属性和属性类型 三.反射动态修改类属性的注解值 四.反射获取类的方法及调用方式 总结 前言 我在实际项目当中有经常用到反射机制,故而将学会的反射用法做一些汇总笔记,当做以后复盘所用. 存在这样一个类: package com.example.demo; import com.alibaba.fastjson.annotation.JSONField; public class User { private String name; @

  • JAVA中反射机制和模块化的深入讲解

    目录 一.类加载 1.1类加载描述 1.2类的加载 1.3类的连接 1.4类的初始化 1.4.1类初始化的作用 1.4.2初始化步骤 1.4.3类的初始化时机 二.反射 2.1反射的概述 2.2获取Class类对象的三种方式 2.3反射获取构造方法 2.4反射获取成员变量 2.5反射获取成员方法 2.6反射的案例 2.6.1反射练习之越过泛型检查 2.6.2运行配置文件中指定类的指定方法 三.模块化 3.1模块化概述 ​​​​​​​​​​​​​​3.2模块化使用 3.3模块化的基本使用 总结 一

随机推荐