广告
返回顶部
首页 > 资讯 > 精选 >Java反射技术怎么用
  • 844
分享到

Java反射技术怎么用

2023-06-25 14:06:28 844人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“Java反射技术怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java反射技术怎么用”这篇文章吧。一、基本反射技术1.1 根据一个字符串得到一个类getClass

这篇文章主要为大家展示了“Java反射技术怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java反射技术怎么用”这篇文章吧。

    一、基本反射技术

    1.1 根据一个字符串得到一个类

    getClass方法
     String name = "Huanglinqing"; Class c1 = name.getClass(); System.out.println(c1.getName());

    打印结果如下:

    Java反射技术怎么用

    Class.forName

    比如我们获取java.lang.String的类名

       String name = "java.lang.String";   Class c1 = null;   try {          c1 = Class.forName(name);          System.out.println(c1.getName());      } catch (ClassNotFoundException e) {  }

    这里也通过捕获异常,因为我们传的这个字符串可能不合法,字符串合法命名是类的命名空间和类的名称组成

    打印结果如下:

    Java反射技术怎么用

    我们还可以通过c1.getSuperclass()获取到他的父类

    Type属性

    基本类型都有type属性,可以得到这个基本类型的类型,比如:

    Class c1 = Boolean.TYPE;Class c2 = Byte.TYPE;Class c3 = Float.TYPE;Class c4 = Double.TYPE;

    二、获取类的成员

    当类中方法定义为私有的时候我们能调用?不能!当变量是私有的时候我们能获取吗?不能!但是反射可以,比如源码中有你需要用到的方法,但是那个方法是私有的,这个时候你就可以通过反射去执行这个私有方法,并且获取私有变量。

    获取类的构造函数

    为了便于测试,我们定义一个Test类,Test类如下:(省略get和set方法)

    Test类中我们定义是三个私有变量,生成两个公有的含参构造方法和一个私有的含参构造方法以及一个公有的无参构造方法。

    public class Test {    private int age;    private String name;    private int testint;    public Test(int age) {        this.age = age;    }    public Test(int age, String name) {        this.age = age;        this.name = name;    }    private Test(String name) {        this.name = name;    }    public Test() {    }

    下面我们通过反射获取这些构造方法

    获取类的所有构造方法

     Test test = new Test(); Class c4 = test.getClass(); Constructor[] constructors ; constructors = c4.getDeclaredConstructors();

    通过getDeclaredConstructors可以返回类的所有构造方法,返回的是一个数组因为构造方法可能不止一个,通过getModifiers可以得到构造方法的类型,getParameterTypes可以得到构造方法的所有参数,返回的是一个Class数组,所以我们如果想获取所有构造方法以及每个构造方法的参数类型,可以有如下代码:

      for (int i = 0; i < constructors.length; i++) {        System.out.print(Modifier.toString(constructors[i].getModifiers()) + "参数:");        Class[] parametertypes = constructors[i].getParameterTypes();        for (int j = 0; j < parametertypes.length; j++) {             System.out.print(parametertypes[j].getName() + " ");       }      System.out.println("");  }

    运行结果如下所示:

    Java反射技术怎么用

    这样我们就得到了类中所有构造方法和构造方法中的参数,那么我们如何获取特定的构造方法呢?

    获取类中特定的构造方法

    我们可以通过getConstructors方法获取类中 所有的public类型的构造方法,代码和上面一样就不演示了。

    我们可以通过getDeclaredConstructor()方法传参获取特定参数类型的构造方法,这里注意是getDeclaredConstructor()不是 getDeclaredConstructors() ,所以返回的是一个Class对象而不是一个Class数组。

    获取无参构造方法直接不传参数,如下所示:

       try {          constructors = c4.getDeclaredConstructor();          System.out.print(Modifier.toString(constructors.getModifiers()) + );        } catch (NoSuchMethodException e) {            e.printStackTrace();      }

    这里要进行异常捕获,因为可能不存在对应的构造方法,打印结果如下:

    Java反射技术怎么用

    如果我们想获取有两个参数分别为int和String类型的构造方法,代码如下:

      Class[] p = {int.class,String.class};  try {       constructors = c4.getDeclaredConstructor(p);       System.out.print(Modifier.toString(constructors.getModifiers()) + "参数:");       Class[] parametertypes = constructors.getParameterTypes();       for (int j = 0; j < parametertypes.length; j++) {            System.out.print(parametertypes[j].getName() + " ");          }       } catch (NoSuchMethodException e) {            e.printStackTrace();     }

    这里我们同样打印出构造方法的参数:

    Java反射技术怎么用

    调用构造方法

    从这里开始慢慢到了关键的一步,得到类的实例,我们主要借助于newInstance方法,为了方便演示我们将测试类的两个构造方法打印出来.

       public Test(int age, String name) {        this.age = age;        this.name = name;        System.out.println("hello" + name + "i am" + age);    }    private Test(String name) {        this.name = name;        System.out.println("My Name is" +                name);    }

    我们先来调用public的方法,如下所示:

     Class[] p = {int.class,String.class}; constructors = c4.getDeclaredConstructor(p); constructors.newInstance(24,"HuangLinqing");

    运行打印结果如下:

    Java反射技术怎么用

    那么调用私有构造方法呢,和上面一样,只是我们要设置constructors.setAccessible(true);代码如下:

      Class[] p = {String.class};  constructors = c4.getDeclaredConstructor(p);  constructors.setAccessible(true);  constructors.newInstance("HuangLinqing");

    打印结果如下:

    Java反射技术怎么用

    调用类的私有方法

    如何调用类中的私有方法呢,我们先在测试类中编写一个测试的私有方法 如下:

      private void welcome(String tips){        System.out.println(tips);    }

    我们知道如果我们要正常的调用类的方法都是通过类.方法调用,所以我们调用私有方法也需要得到类的实例,而我们上面newInstace已经得到了类的实例,这样就好办了。

       Class[] p4 = {String.class};   Method method = c4.getDeclaredMethod("welcome",p4);   method.setAccessible(true);

    我们首先通过 getDeclaredMethod方法获取到这个私有方法,第一个参数是方法名,第二个参数是参数类型

    然后通过invoke方法执行,invoke需要两个参数一个是类的实例,一个是方法参数。

     Class[] p4 = {String.class};     Method method = c4.getDeclaredMethod("welcome",p4);     method.setAccessible(true);     Object arg1s[] = {"欢迎关注代码男人技术公众号"};     method.invoke(test,arg1s);

    test类的实例当不能new 获取的时候我们也可以通过反射获取,就是上面的newInstance方法。

    打印结果如下:

    Java反射技术怎么用

    获取类的私有字段并修改值

    看到这里你可能会说,有了set方法,什么私有不私有,test.set不就可以了,但是这里要注意我们是没有办法得到这个类的实例的,要不然都可以得到实例就没有反射一说了。我们在通过反射得到类的实例之后先获取字段:

    Field field = c4.getDeclaredField("name");field.setAccessible(true);field.set(o,"代码男人");

    是我们上面通过反射构造方法获取的实例, 打印field.get(o).toString()的值如下:

    Java反射技术怎么用

    不过要注意的是我们修改了name的值只对当前的实例对象有效。

    Java的基本反射语法就是这样了,欢迎加入技术群一起探讨!

    最后反射封装类如下:

    package jnidemo.hlq.com.hookdemo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Reflex {        public static Object createObject(String className) {        Class[] pareTyples = new Class[]{};        Object[] pareVaules = new Object[]{};        try {            Class r = Class.forName(className);            return createObject(r, pareTyples, pareVaules);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }        public static Object createObject(Class clazz) {        Class[] pareTyple = new Class[]{};        Object[] pareVaules = new Object[]{};        return createObject(clazz, pareTyple, pareVaules);    }        public static Object createObject(String className, Class pareTyple, Object pareVaule) {        Class[] pareTyples = new Class[]{pareTyple};        Object[] pareVaules = new Object[]{pareVaule};        try {            Class r = Class.forName(className);            return createObject(r, pareTyples, pareVaules);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }        public static Object createObject(Class clazz, Class pareTyple, Object pareVaule) {        Class[] pareTyples = new Class[]{pareTyple};        Object[] pareVaules = new Object[]{pareVaule};        return createObject(clazz, pareTyples, pareVaules);    }        public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {        try {            Class r = Class.forName(className);            return createObject(r, pareTyples, pareVaules);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }        public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) {        try {            Constructor ctor = clazz.getDeclaredConstructor(pareTyples);            ctor.setAccessible(true);            return ctor.newInstance(pareVaules);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }        public static Object invokeInstanceMethod(Object obj, String methodName, Class[] pareTyples, Object[] pareVaules) {        if (obj == null) {            return null;        }        try {            //调用一个private方法 //在指定类中获取指定的方法            Method method = obj.getClass().getDeclaredMethod(methodName, pareTyples);            method.setAccessible(true);            return method.invoke(obj, pareVaules);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }        public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {        Class[] pareTyples = {pareTyple};        Object[] pareVaules = {pareVaule};        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);    }        public static Object invokeInstanceMethod(Object obj, String methodName) {        Class[] pareTyples = new Class[]{};        Object[] pareVaules = new Object[]{};        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);    }        public static Object invokeStaticMethod(String className, String method_name) {        Class[] pareTyples = new Class[]{};        Object[] pareVaules = new Object[]{};        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);    }        public static Object invokeStaticMethod(String className, String method_name, Class pareTyple, Object pareVaule) {        Class[] pareTyples = new Class[]{pareTyple};        Object[] pareVaules = new Object[]{pareVaule};        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);    }        public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {        try {            Class obj_class = Class.forName(className);            return invokeStaticMethod(obj_class, method_name, pareTyples, pareVaules);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }        public static Object invokeStaticMethod(Class clazz, String method_name) {        Class[] pareTyples = new Class[]{};        Object[] pareVaules = new Object[]{};        return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);    }        public static Object invokeStaticMethod(Class clazz, String method_name, Class classType, Object pareVaule) {        Class[] classTypes = new Class[]{classType};        Object[] pareVaules = new Object[]{pareVaule};        return invokeStaticMethod(clazz, method_name, classTypes, pareVaules);    }        public static Object invokeStaticMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) {        try {            Method method = clazz.getDeclaredMethod(method_name, pareTyples);            method.setAccessible(true);            return method.invoke(null, pareVaules);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    public static Object getFieldObject(String className, Object obj, String filedName) {        try {            Class obj_class = Class.forName(className);            return getFieldObject(obj_class, obj, filedName);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }    public static Object getFieldObject(Class clazz, Object obj, String filedName) {        try {            Field field = clazz.getDeclaredField(filedName);            field.setAccessible(true);            return field.get(obj);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    public static void setFieldObject(Class clazz, Object obj, String filedName, Object filedVaule) {        try {            Field field = clazz.getDeclaredField(filedName);            field.setAccessible(true);            field.set(obj, filedVaule);        } catch (Exception e) {            e.printStackTrace();        }    }    public static void setFieldObject(String className, Object obj, String filedName, Object filedVaule) {        try {            Class obj_class = Class.forName(className);            setFieldObject(obj_class, obj, filedName, filedVaule);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    public static Object getStaticFieldObject(String className, String filedName) {        return getFieldObject(className, null, filedName);    }    public static Object getStaticFieldObject(Class clazz, String filedName) {        return getFieldObject(clazz, null, filedName);    }    public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {        setFieldObject(classname, null, filedName, filedVaule);    }    public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {        setFieldObject(clazz, null, filedName, filedVaule);    }}

    以上是“Java反射技术怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: Java反射技术怎么用

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

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

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

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

    下载Word文档
    猜你喜欢
    • Java反射技术怎么用
      这篇文章主要为大家展示了“Java反射技术怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java反射技术怎么用”这篇文章吧。一、基本反射技术1.1 根据一个字符串得到一个类getClass...
      99+
      2023-06-25
    • Java反射技术详解
      目录前言一、基本反射技术1.1 根据一个字符串得到一个类getClass方法Class.forNameType属性二、获取类的成员获取类中特定的构造方法调用构造方法调用类的私有方法获...
      99+
      2022-11-12
    • Java核心技术之反射
      目录一、Class类与Java反射1、访问构造方法2、访问成员变量3、访问方法二、使用Annotation功能1、定义Annotation类型2、访问Annotation信息总结一、...
      99+
      2022-11-12
    • java反射技术的使用场景
      这篇文章主要介绍“java反射技术的使用场景”,在日常操作中,相信很多人在java反射技术的使用场景问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java反射技术的使用场景”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-03
    • 如何理解Java反射技术
      本篇内容介绍了“如何理解Java反射技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前期概要1、 什么是反射Java 反射机制在程序运...
      99+
      2023-06-02
    • 如何在Java中应用反射技术
      如何在Java中应用反射技术?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、反射概念Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象...
      99+
      2023-06-15
    • java的反射技术详细介绍
      本篇内容主要讲解“java的反射技术详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java的反射技术详细介绍”吧!反射的定义:审查元数据并收集关于它的类型信息的能力。下面介绍java的反...
      99+
      2023-06-17
    • Java基础之反射技术相关知识总结
      目录一、反射概念二、反射应用场景三、反射更多细节一、反射概念 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类...
      99+
      2022-11-12
    • Java反射机制怎么应用
      本篇内容主要讲解“Java反射机制怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制怎么应用”吧!反射基础p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没...
      99+
      2023-06-17
    • Java反射机制怎么使用
      今天小编给大家分享一下Java反射机制怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。反射的概述JAVA反射机制是在运...
      99+
      2023-06-30
    • Java反射库怎么实现
      这篇“Java反射库怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java反射库怎...
      99+
      2022-10-19
    • java什么反射?
      java什么反射?反射是Java的特征之一,是一种间接操作目标对象的机制。JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象...
      99+
      2016-04-05
      java教程 java 反射
    • 怎么用java反射创建对象
      使用Java反射创建对象需要以下步骤:1. 获取Class对象:首先需要获取要创建对象的类的Class对象。可以通过类名直接调用`C...
      99+
      2023-10-10
      java
    • 怎么用java反射获取对象
      这篇“怎么用java反射获取对象”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用java反射获取对象”文章吧。本教程操作...
      99+
      2023-06-30
    • java注解和反射怎么使用
      Java注解和反射是Java编程中非常重要的概念。注解是一种元数据,可以用来为Java程序提供额外的信息,而反射则允许程序在运行时动...
      99+
      2023-05-29
      java注解和反射 java
    • Java基础之反射怎么使用
      本篇内容介绍了“Java基础之反射怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!反射是框架设计的灵魂(使用的前提条件:必须先得到代表...
      99+
      2023-07-05
    • Java反射有什么用
      小编给大家分享一下Java反射有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、回顾:什么是反射?反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作...
      99+
      2023-06-25
    • java反射应用
      反射使用JAVA反应进行两个vo有相同字段名字进行子转换:@Test public void doTransTest() { A a= new A(); A.setC(111L); ...
      99+
      2017-08-29
      java教程 java
    • 怎么用java反射获取字段值
      要使用Java反射获取字段的值,可以按照以下步骤进行操作: 获取类的Class对象:通过`Class.forName()`方法或者...
      99+
      2023-10-27
      java
    • java中的反射机制怎么应用
      Java中的反射机制可以应用于以下场景: 动态加载类:可以在运行时加载指定的类,而不是在编译时就确定类的类型。 创建对象:可...
      99+
      2023-10-23
      java
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作