广告
返回顶部
首页 > 资讯 > 精选 >如何在Java中应用反射技术
  • 642
分享到

如何在Java中应用反射技术

2023-06-15 05:06:10 642人浏览 泡泡鱼
摘要

如何在Java中应用反射技术?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、反射概念Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象

如何在Java中应用反射技术?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、反射概念

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

二、反射应用场景

几乎所有的框架都会用到反射

程序解耦合使用

代码更加的优雅

三、反射更多细节

jdk中的位置: java.lang.reflect包下

如何在Java中应用反射技术

获取字节码方式

// 通过类的全限定类名获取Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");// 通过类直接获取Class<Hero> clazzB = Hero.class;// 通过实例化对象获取Class<? extends Hero> clazzC = (new Hero()).getClass();// 基本类型的包装类的type获取Class<Byte> byteClazz = Byte.TYPE;Class<Short> typeClazz = Short.TYPE;Class<Integer> integerClazz = Integer.TYPE;Class<Long> lonGClazz = Long.TYPE;Class<Float> floatClazz = Float.TYPE;Class<Double> doubleClazz = Double.TYPE;Class<Character> characterClazz = Character.TYPE;Class<Boolean> booleanClazz = Boolean.TYPE;

测试类Hero省略Setter和Getter以及toString方法其中包含无参构造和满参构造

package com.open_source.demo.domain;public class Hero {        private String type;        private String name;        private Double CE;        public void attrbute(Hero hero) {        System.out.println(hero.getType() + ": " + hero.getName() + "输出伤害: " + hero.getCE());    }        public void fighting() {        System.out.println("稳住 我们能赢");    }        public void attack(String name) {        System.out.println("准备向" + name + "发起进攻");    }    public Hero(String type, String name, Double CE) {                this.type = type;        this.name = name;        this.CE = CE;    }    public Hero() {    }}

获取类的成员

获取类的构造函数

import java.util.StringJoiner;public class ReflectClient {    public static void main(String[] args) throws ClassNotFoundException {        // 通过类的全限定类名获取        Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");        // 获取所有构造函数字节码        Constructor<?>[] declaredConstructors = clazzA.getDeclaredConstructors();        // 打印构造函数修饰符以及参数类型        for (int i = 0; i < declaredConstructors.length; i++) {            // 美化输出            StringJoiner sj = new StringJoiner(", ","[","]");            System.out.print("构造函数修饰符:" + Modifier.toString(declaredConstructors[i].getModifiers()) + "  参数类型:");            Class<?>[] parameterTypes = declaredConstructors[i].getParameterTypes();            for (int j = 0; j < parameterTypes.length; j++) {                sj.add(parameterTypes[j].getName());            }            System.out.println(sj.toString());        }    }}// 打印内容  构造函数修饰符:public  参数类型:[java.lang.String, java.lang.String, java.lang.Double] 构造函数修饰符:public  参数类型:[]

获取指定构造函数

// 通过类的全限定类名获取Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");// 获取满参构造Constructor<?> allArgsConstructor = clazzA.getDeclaredConstructor(String.class, String.class, Double.class);// 获取无参构造Constructor<?> noneArgConstructor = clazzA.getDeclaredConstructor();

调用构造函数

public class ReflectClient {    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        // 通过类的全限定类名获取        Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");        // 获取满参构造        Constructor<?> allArgsConstructor = clazzA.getDeclaredConstructor(String.class, String.class, Double.class);        // 获取无参构造        Constructor<?> noneArgConstructor = clazzA.getDeclaredConstructor();        // 如果修饰符为private需要使用暴力反射        // noneArgConstructor.setAccessible(true);        Hero hero = (Hero) noneArgConstructor.newInstance();        hero.setType("射手");        hero.setName("后裔");        hero.setCE(1000.0);        System.out.println(hero);        Hero heroAll = (Hero) allArgsConstructor.newInstance("法师", "诸葛亮", 1000.1);        heroAll.attrbute(heroAll);    }}// 控制台输出Hero{type='射手', name='后裔', CE=1000.0}法师: 诸葛亮 输出伤害: 1000.1

获取成员方法

public class ReflectClient {    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        // 通过类的全限定类名获取        Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");        // 获取无参构造        Constructor<?> noneArgConstructor = clazzA.getDeclaredConstructor();        Hero hero = (Hero) noneArgConstructor.newInstance();        // 获取所有成员方法        Method[] declaredMethods = clazzA.getDeclaredMethods();        for (int i = 0; i < declaredMethods.length; i++) {            StringJoiner sj = new StringJoiner(",", "[", "]");            System.out.print("方法名称:" + declaredMethods[i].getName() + " 方法参数: ");            Class<?>[] parameterTypes = declaredMethods[i].getParameterTypes();            for (int j = 0; j < parameterTypes.length; j++) {                sj.add(parameterTypes[j].getName());            }            System.out.println(sj.toString());        }    }}// 控制台输出方法名称:attrbute 方法参数: [com.open_source.demo.domain.Hero]方法名称:attack 方法参数: [java.lang.String]set和get省略

方法调用

// 获取attack字节码对象Method attackMethod = clazzA.getDeclaredMethod("attack", String.class);// 如果修饰符为private同样需要使用暴力反射attackMethod.invoke(hero,"周瑜");// 控制台输出准备向周瑜发起进攻

获取所有的成员属性

public class ReflectClient {    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        // 通过类的全限定类名获取        Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero");        // 获取所有成员属性        Field[] declaredFields = clazzA.getDeclaredFields();        Stream.of(declaredFields).forEach(System.out::println);    }}// 控制台输出private java.lang.String com.open_source.demo.domain.Hero.typeprivate java.lang.String com.open_source.demo.domain.Hero.nameprivate java.lang.Double com.open_source.demo.domain.Hero.CE

获取父类的字节码

// 通过类的全限定类名获取Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero").getSuperclass();

反射工具类

package com.open_source.demo.support;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.math.BigDecimal;import java.text.SimpleDateFORMat;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List;public class ReflectSupport {    private ReflectSupport(){};        public static synchronized String getStringValue(String fieldName,Object obj) throws  ReflectiveOperationException{        Object objectValue = getValueByGetter(fieldName,obj);        if (objectValue == null){            return "";        }        String result = objectValue.toString();        //如果类型为BigDecimal,去掉末尾的0        if (objectValue instanceof BigDecimal){            BigDecimal value = (BigDecimal) objectValue;            value = value.stripTrailingZeros();            result = value.toPlainString();        }else if (objectValue instanceof Date){            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            result = sdf.format((Date)objectValue).replace(" 00:00:00", "");        }        return result.trim();    }    public static Object getValueByGetter (String fieldName,Object obj) throws ReflectiveOperationException {        Method getter = getGetter(fieldName, obj.getClass());        if (getter != null){            return getter.invoke(obj);        }        return null;    }    public static Object setValueBySetter (String fieldName,Object obj) throws ReflectiveOperationException {        Method setter = getSetter(fieldName, obj.getClass());        if (setter == null){            throw new ReflectiveOperationException("没有set方法");        }        return setter.invoke(obj);    }        public static Method getGetter(String fieldName,Class<?> cls){        for (Method method : cls.getMethods()) {            if (method.getName().equalsIgnoreCase("get".concat(fieldName)) && method.getParameterTypes().length == 0){                return  method;            }        }        return null;    }        public static Method getSetter(String fieldName,Class<?> cls){        for (Method method : cls.getMethods()) {            if (method.getName().equalsIgnoreCase("set".concat(fieldName)) && method.getParameterTypes().length == 0){                return  method;            }        }        return null;    }        public static synchronized Field getFieldByName(String fieldName,Class<?> cls){        Field[] fields =cls.getDeclaredFields();        for (Field field : fields){            if (field.getName().equals(fieldName)){                return field;            }        }        if (cls.getSuperclass() != null){            return getFieldByName(fieldName,cls.getSuperclass());        }        return null;    }        public static List<Field> listFields(Class<?> cls){        Field[] fs = cls.getDeclaredFields();        List<Field> fields = new ArrayList<>(Arrays.asList(fs));        if (cls.getSuperclass() !=null){            fields.addAll(listFields(cls.getSuperclass()));        }        return fields;    }    public static  boolean fieldExist(String fieldName,Class<?> cls){        return getFieldByName(fieldName, cls) !=null;    }}

Java的特点有哪些

Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、WEB应用程序、分布式系统和嵌入式系统应用程序等。

看完上述内容,你们掌握如何在Java中应用反射技术的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何在Java中应用反射技术

本文链接: https://www.lsjlt.com/news/278026.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在Java中应用反射技术
    如何在Java中应用反射技术?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、反射概念Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象...
    99+
    2023-06-15
  • 如何理解Java反射技术
    本篇内容介绍了“如何理解Java反射技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前期概要1、 什么是反射Java 反射机制在程序运...
    99+
    2023-06-02
  • Java反射技术怎么用
    这篇文章主要为大家展示了“Java反射技术怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java反射技术怎么用”这篇文章吧。一、基本反射技术1.1 根据一个字符串得到一个类getClass...
    99+
    2023-06-25
  • java反射技术的使用场景
    这篇文章主要介绍“java反射技术的使用场景”,在日常操作中,相信很多人在java反射技术的使用场景问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java反射技术的使用场景”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • 如何在java中使用反射调用方法
    这篇文章将为大家详细讲解有关如何在java中使用反射调用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的...
    99+
    2023-06-14
  • Java反射机制在Spring IOC中的应用详解
    目录Java反射机制在SpringIOC的应用下面是Spring通过配置进行实例化对象Spring的配置如下所示实现一下Spring底层处理原理反射机制、反射机制的作用、反射机制的功...
    99+
    2022-11-12
  • 如何在Java中利用反射创建对象
    本篇文章给大家分享的是有关如何在Java中利用反射创建对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、什么是反射Java Reflaction in Action中的解释...
    99+
    2023-06-15
  • Java反射如何使用
    这篇文章将为大家详细讲解有关Java反射如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。反射相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的...
    99+
    2023-06-25
  • AJPFX反射及反射的应用该如何理解
    本篇文章为大家展示了AJPFX反射及反射的应用该如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。怎么理解反射,反射的应用        反射就是把Jav...
    99+
    2023-06-02
  • 如何在Java项目中使用注解和反射
    今天就跟大家聊聊有关如何在Java项目中使用注解和反射,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开...
    99+
    2023-06-06
  • java中的反射机制怎么应用
    Java中的反射机制可以应用于以下场景: 动态加载类:可以在运行时加载指定的类,而不是在编译时就确定类的类型。 创建对象:可...
    99+
    2023-10-23
    java
  • 详解Java编程中的反射在Android开发中的应用
    反射定义 “反射”(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。 为何需要反射 反射带来的好处包括:     在运...
    99+
    2022-06-06
    java编程 反射 JAVA android开发 Android
  • 在java中如何使用反射获取泛型信息
    ParameterizedType就是参数化类型的意思。解释:声明类型中带有“”的都是参数化类型,比如List,Map。getActualTypeArguments()返回Type[],即“”里的参数,比如Map。getRawType()返...
    99+
    2019-10-08
    java教程 java 反射 泛型信息
  • 如何使用Java反射机制
    这篇文章主要介绍“如何使用Java反射机制”,在日常操作中,相信很多人在如何使用Java反射机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java反射机制”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • 怎么在java中使用反射调用方法
    这篇文章将为大家详细讲解有关怎么在java中使用反射调用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-14
  • 如何用java反射技术将sql操作与面向对象编程关联起来
    这篇“如何用java反射技术将sql操作与面向对象编程关联起来”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用java反...
    99+
    2023-06-30
  • Java技术在生活中的有哪些应用
    这篇文章主要为大家展示了“Java技术在生活中的有哪些应用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java技术在生活中的有哪些应用”这篇文章吧。安卓应用如果你想弄清楚Java用在什么地方,...
    99+
    2023-06-02
  • 怎么在java中利用反射创建实例
    怎么在java中利用反射创建实例?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 怎么在java中利用反射获取对象
    本篇文章为大家展示了怎么在java中利用反射获取对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开...
    99+
    2023-06-14
  • 怎么在java中利用反射创建对象
    今天就跟大家聊聊有关怎么在java中利用反射创建对象,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作