返回顶部
首页 > 资讯 > 精选 >JAVA编程中的反射用法总结
  • 943
分享到

JAVA编程中的反射用法总结

2023-06-20 16:06:04 943人浏览 独家记忆
摘要

本篇内容主要讲解“JAVA编程中的反射用法总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA编程中的反射用法总结”吧!目录下面对Java反射的基础知识进行说明和总结:总结下面对Java反

本篇内容主要讲解“JAVA编程中的反射用法总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA编程中的反射用法总结”吧!

目录
  • 下面对Java反射的基础知识进行说明和总结:

  • 总结

下面对Java反射的基础知识进行说明和总结:

首先定义一个MyBase类,其中有私有字段,也有公有字段。同时也有公有方法和私有方法。MyBase类示例如下:

package com.hwdev.demo;public class MyBase {    //公有字段      public int version  = 1;    //私有字段    private String date = "2021-05-18" ;    //公有方法       public void say2(String msg){System.out.println("Hello " + msg);    }    //私有方法    private String getData(){        return this.date;    }}//加入Java开发交流君样:756584822一起吹水聊天

这里再定义一个Hello类,它继承自MyBase类,通过继承主要用于验证一下反射对于父类、子类的反射用法。

package com.hwdev.demo;public class Hello extends MyBase {    public String author = "JackWang" ;    public int version  = 1;    private String company = "kzcloud" ;    public void say(String msg){     System.out.println("Hello " + msg);    }    public void setAuthor(String author){    this.author = author;    }    public String getAuthor(){        return this.author;    }    private int getVersion(){        return this.version;    }}

关于Java反射,功能强大的就是可以通过字符串配置来动态从系统中调用方法或者修改其中某个对象的字段值,而Class.forName方法即可以通过传入类全路径字符串名称来获取对应的Class对象,非常的方便。另外通过getField方法和GetMethod方法可以获取指定字段和方法,并动态调用。

package com.hwdev.demo;import java.lang.reflect.*;import java.util.Arrays;public class ReflectDemo01 {     public static void Test() {        try        {            //通过字符串全路径类名查找Class            Class helloC = Class.forName("com.hwdev.demo.Hello");             //获取所有公有的字段数组,私有的无法获取               Field [] fields = helloC.getFields();            //打印字段数组内容//加入Java开发交流君样:756584822一起吹水聊天            System.out.println(Arrays.toString(fields));            //[public java.lang.String com.hwdev.demo.Hello.author, public int com.hwdev.demo.Hello.version]            //实例化            Object obj = helloC.newInstance();            //获取特定字段,比遍历Field[]效率更高            Field f = helloC.getField("author");            if (f != null){                //关闭安全检查,提高效率                f.setAccessible(true);                //获取字段author内容                String author = (String)f.get(obj);                System.out.println("author=" + author);                //author=JackWang            }            //获取所有公有的方法数组,私有的无法获取             Method [] methods = helloC.getMethods();            //打印方法数组内容,子类等方法也可以获取到            System.out.println(Arrays.toString(methods));            //本类所有方法            Method [] methods2 = helloC.getDeclaredMethods();            //打印方法数组内容            System.out.println(Arrays.toString(methods2));            //获取特定方法,第二个参数String.class为say方法的参数类型            //say(java.lang.String)            Method m = helloC.getDeclaredMethod("say",String.class);             if (m != null){                //关闭安全检查,提高效率                m.setAccessible(true);                //获取字段author内容                Object returnValue = m.invoke(obj, new Object[]{"Java"});                //Hello Java                if (returnValue!=null){                    System.out.println("returnValue =" + returnValue);                    }            }//加入Java开发交流君样:756584822一起吹水聊天        }catch(ClassNotFoundException | SecurityException ex){            ex.printStackTrace();        }        catch(Exception ex){            ex.printStackTrace();        }    }    }

这里需要注意:xxx.getMethods()方法默认情况下,会返回本类、父类、父接口的公有方法,而xxx.getDeclaredMethods()返回本类的 所有方法,包括私有的方法。同理,反射api中其他getXXX和getDeclaredXXX的用法类似。

package com.hwdev;import com.hwdev.demo.ReflectDemo01;public class Main {        public static void main(String[] args) {        //反射第一种用法 Class.forName        ReflectDemo01.Test();    }    }

执行程序,输出的结果如下:

[public java.lang.String com.hwdev.demo.Hello.author, public int com.hwdev.demo.Hello.version, public int com.hwdev.demo.MyBase.version] author=JackWang [public void com.hwdev.demo.Hello.say(java.lang.String), public void com.hwdev.demo.Hello.setAuthor(java.lang.String), public java.lang.String com.hwdev.demo.Hello.getAuthor(), public void com.hwdev.demo.MyBase.say2(java.lang.String), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()] [public void com.hwdev.demo.Hello.say(java.lang.String), public void com.hwdev.demo.Hello.setAuthor(java.lang.String), public java.lang.String com.hwdev.demo.Hello.getAuthor(), private int com.hwdev.demo.Hello.getVersion()] Hello Java

从输出结果上来看,Field [] fields = helloC.getFields();不但可以获取Hello类的公有字段,还可以获取到父类MyBase的公有字段:com.hwdev.demo.MyBase.version

而Method [] methods2 = helloC.getDeclaredMethods();则可以获取本类,即Hello类所有的方法,包括公有的方法和私有的方法。因此,Java反射可以访问类的私有字段和方法,从而暴露内部的信息,这也是Java反射有安全问题的原因。

由于Java方法支持重载,因此同名的方法可以存在多个,即参数不同,因此在用反射调用方法时,需要指定方法的参数类型,这样就可以明确调到的具体是哪个方法签名,如`Method m = helloC.getDeclaredMethod("say",String.class); `调用的是`public void com.hwdev.demo.Hello.say(java.lang.String) `。

除了可以用Class.forName来进行反射外,还可以通过如下方式来获取反射对象:

Hello hello = new Hello();Class helloC = hello.getClass();Field [] fields = helloC.getFields();//Class helloC = Hello.class; Field [] fields = helloC.getFields();

下面介绍一下如何用Java反射修改私有字段和调用私有方法的示例:

package com.hwdev.demo;import java.lang.reflect.*;public class ReflectDemo02 {   //加入Java开发交流君样:756584822一起吹水聊天      public static void Test() {        try        {            //通过已有类查找Class                     Class helloC = Hello.class;             //实例化            Object obj = helloC.newInstance();            //获取特定私有字段            Field f = helloC.getDeclaredField("company");            if (f != null){                //私有必须开启                f.setAccessible(true);                //设置私有字段值                f.set(obj, "newKZ");                //获取字段author内容                String fv = (String)f.get(obj);                System.out.println("company=" + fv);                //company=newKZ            }             //获取私有方法            Method m = helloC.getDeclaredMethod("getVersion", null);             if (m != null){                //私有必须开启                m.setAccessible(true);                Object returnValue = m.invoke(obj, null);                if (returnValue!=null){                    //returnValue =1                    System.out.println("returnValue =" + returnValue);                    }            }        }catch(SecurityException ex){            ex.printStackTrace();        }        catch(Exception ex){            ex.printStackTrace();        }    }    }

另外,Java反射可以获取注解信息,这个对于ORM框架来讲,用的非常多。

package com.hwdev.demo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface ORMAnnotation {    public String FieldName();    public String FieldType();}

其中,@Retention(RetentionPolicy.RUNTIME)表示注解可以在运行时通过反射访问。@Target(ElementType.FIELD) 表示这个注解只能用在字段上面。同理,可以把FIELD改为Type或者Method等。

package com.hwdev.demo;import java.lang.annotation.Annotation;import java.lang.reflect.*;//加入Java开发交流君样:756584822一起吹水聊天public class ReflectDemo03 {     public static void Test() {        try        {            Class helloC = Class.forName("com.hwdev.demo.HelloAnnotation");                  Field[] fields = helloC.getDeclaredFields();            for(Field f : fields){                 //关闭安全检查,提高效率                f.setAccessible(true);                Annotation ann = f.getAnnotation(ORMAnnotation.class);                if(ann instanceof ORMAnnotation){                    ORMAnnotation ormAnn = (ORMAnnotation) ann;                    System.out.println("FieldName=" + ormAnn.FieldName());                    System.out.println("FieldType=" + ormAnn.FieldType());                }            }                  }catch(ClassNotFoundException | SecurityException ex){            ex.printStackTrace();        }        catch(Exception ex){            ex.printStackTrace();        }    }    }

执行此示例,则输出如下:

FieldName=f_author FieldType=varchar(50) FieldName=f_ver FieldType=int

再次,介绍一下如何用反射获取方法参数个数和类型,其中包含泛型的信息获取:

package com.hwdev.demo;import java.util.ArrayList;import java.util.List;public class GenericCls {   protected List<String> myList = new ArrayList();    public GenericCls(int size){             for(int i = 0;i<size;i++){           myList.add("item"+i);       }   }   public  List<String> getList(){       return this.myList;   }   public String getList(int idx){       return this.myList.get(idx);   }}package com.hwdev.demo;import java.lang.reflect.*;public class ReflectDemo05 {     public static void Test() {        try        {        //加入Java开发交流君样:756584822一起吹水聊天            Class helloC = Class.forName("com.hwdev.demo.GenericCls");             //构造函数调用            Object obj = helloC.getConstructor(int.class).newInstance(3);            Method method = helloC.getMethod("getList", int.class);            Class<?> returnType = method.getReturnType();            System.out.println("ReturnType = " + returnType.getName());            Parameter[] params = method.getParameters();            for(Parameter p : params){                    System.out.println("ParameterizedType = " + p.getParameterizedType());                System.out.println("getModifiers = " + p.getModifiers());                System.out.println("getName = " + p.getName());                System.out.println("getType = " + p.getType());            }           //调用方法           Object ret =  method.invoke(obj, new Object[]{2});           System.out.println("ret = " + ret.toString());            Method method2 = helloC.getMethod("getList", null);            Type greturnType = method2.getGenericReturnType();            System.out.println("getGenericReturnType = " + returnType.getName());            if(greturnType instanceof ParameterizedType){                ParameterizedType type = (ParameterizedType) greturnType;                System.out.println("type = " + type.getTypeName());                Type[] typeArguments = type.getActualTypeArguments();                for(Type typeArgument : typeArguments){                    Class typeArGClass = (Class) typeArgument;                    System.out.println("typeArgClass = " + typeArgClass);                }            }        }catch(ClassNotFoundException | SecurityException ex){            ex.printStackTrace();        }        catch(Exception ex){            ex.printStackTrace();        }    }    }

执行此示例,则输出如下:

R`eturnType = java.lang.String ParameterizedType = int getModifiers = 0 getName = arg0 getType = int ret = item2 getGenericReturnType = java.lang.String type = java.util.List<java.lang.String> typeArgClass = class java.lang.String

到此,相信大家对“JAVA编程中的反射用法总结”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JAVA编程中的反射用法总结

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

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

猜你喜欢
  • JAVA编程中的反射用法总结
    本篇内容主要讲解“JAVA编程中的反射用法总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA编程中的反射用法总结”吧!目录下面对Java反射的基础知识进行说明和总结:总结下面对Java反...
    99+
    2023-06-20
  • JAVA编程不能不知道的反射用法总结
    目录下面对Java反射的基础知识进行说明和总结:总结下面对Java反射的基础知识进行说明和总结: 首先定义一个MyBase类,其中有私有字段,也有公有字段。同时也有公有方法和私有方法...
    99+
    2024-04-02
  • 【Java-15】反射知识总结
    01_类的加载 类的加载过程类的加载时机 类的加载 当程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中 说明:Class对象是指java.lang.Class类...
    99+
    2023-08-16
    java
  • Java反射机制的学习总结
    一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。 二、哪里用到反射机制 有些...
    99+
    2022-11-15
    Java 反射机制
  • java编程中的反射实例
    本篇内容主要讲解“java编程中的反射实例”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java编程中的反射实例”吧!当通过接口的方式无法完成我们的目标的时候,我们可以考虑用java的反射机制来...
    99+
    2023-06-03
  • Python中的反射知识点总结
    通过字符串映射或修改程序运行时的状态、属性、方法, 可以通过下面这4中方法 ''' 使用getattr(object, name_str, default=None) 方...
    99+
    2024-04-02
  • Python中反射和描述器总结
    反射在Python中,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。 函数与方法 内建函数:getattr(object,name[,degault])  通过name返回object的属性...
    99+
    2023-01-31
    反射 Python
  • Java开发反射机制的实战经验总结
    目录前言一、创建Class的三种方式二、反射获取类的所有属性和属性类型三、反射动态修改类属性的注解值四、反射获取类的方法及调用方式总结前言 我在实际项目当中有经常用到反射机制,故而将...
    99+
    2024-04-02
  • 详解Java编程中的反射在Android开发中的应用
    反射定义 “反射”(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。 为何需要反射 反射带来的好处包括:     在运...
    99+
    2022-06-06
    java编程 反射 JAVA android开发 Android
  • Java基础之反射技术相关知识总结
    目录一、反射概念二、反射应用场景三、反射更多细节一、反射概念 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类...
    99+
    2024-04-02
  • java编程之递归算法总结
    1.何为递归个人理解就是自己调用自己,直到满足一个条件结束自己调用自己的过程,这个就是递归。举一个通俗的点的例子:假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问前一排的人「你坐在哪一排?」,这样前面的人 ...
    99+
    2023-05-30
    java 递归算法 ava
  • Java 网络编程总结
    目录1、IP地址2、端口3、通信协议3.1 TCP/IP协议簇:实际上是一组协议3.2 TCP UDP对比3.3 TCP实现聊天3.4 TCP文件上传3.5 UDP消息发送3.6 U...
    99+
    2024-04-02
  • java反射之方法反射的基本操作方法
    本文接上文“java反射之获取类的信息方法(推荐)”,利用反射(invoke)来获取一个类中的方法来执行。1、定义一个类,包含三个名称相同,参数不同的方法class A{ public void print(){ System.ou...
    99+
    2023-05-31
    java 反射 方法
  • Java反射魔法揭秘:动态编程的进阶之路
    反射是Java语言中的一项强大功能,它允许程序员在运行时动态地检查和修改类的行为。通过使用反射,可以实现许多有趣的功能,比如: 动态加载类 动态创建实例 动态调用方法 动态修改字段值 动态生成代理类等 反射在Java开发中非常有用,...
    99+
    2024-02-02
    Java 反射 动态编程 动态加载 动态创建 动态调用
  • Java泛型机制与反射原理相关知识总结
    一、泛型的概念 1.1 基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public...
    99+
    2024-04-02
  • C#中反射方法的用法
    这篇文章主要讲解了“C#中反射方法的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中反射方法的用法”吧!首先我们建立一个类库,将它生成为HelloWorld.dll:usingSys...
    99+
    2023-06-18
  • Java中的Object类用法总结
    目录1.Object类是什么?2.Object类中的equals方法3.Object类中的hashCode方法4.编译器自动生成equals和hashCode总结1.Object类是...
    99+
    2023-05-17
    java的object类型 java中的object类 java object类有哪些方法
  • 在Java中Scanner的用法总结
    最近在做OJ类问题的时候,经常由于Scanner的使用造成一些细节问题导致程序不通过(最惨的就是网易笔试,由于sc死循环了也没发现,导致AC代码也不能通过。。。),因此对Scanne...
    99+
    2024-04-02
  • Python网络编程中urllib2模块的用法总结
    一、最基础的应用 import urllib2 url = r'http://www.baidu.com' html = urllib2.urlopen(url).read() print html...
    99+
    2022-06-04
    网络编程 模块 Python
  • 掌握Java反射技巧,成为Java编程高手
    Java反射 反射API 动态获取对象信息 类对象 方法对象 字段对象 构造函数对象 类型信息 Java反射API提供了以下主要功能: 获取对象的类对象 获取对象的属性对象 获取对象的方法对象 获取对象的构造函数对象 动态创建对...
    99+
    2024-02-02
    Java反射是一种动态获取对象信息的强大工具 它允许程序员在运行时检查和修改对象的属性和方法。通过掌握Java反射技巧 程序员可以编写出更加灵活 可扩展和可维护的代码。
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作