Java 反射浅析与使用

这篇具有很好参考价值的文章主要介绍了Java 反射浅析与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

获取Class对象

加载class的方式

  1. 通过Class.forName(className) className:全类名(类包名+类名)
  2. 通过类名.class方法获取
  3. 通过对象的getClass()方法获取
            Class<?> aClass = Class.forName("com.hww.test.Info");
            System.out.println("Class.forName 方式获取:" + aClass);
            Class aClass2 = Info.class;
            System.out.println("方法名.class 方式获取:" + aClass2);
            Info info = new Info();
            Class aClass3 = info.getClass();
            System.out.println("对象.getClass 方式获取:" + aClass3);


执行结果:
Class.forName 方式获取:class com.hww.test.Info
方法名.class 方式获取:class com.hww.test.Info
对象.getClass 方式获取:class com.hww.test.Info

获取构造方法

获取构造函数的方法

  1. getConstructors() 返回该类声明的所有公共构造函数
  2. getDeclaredConstructors() 返回该类声明的所有构造函数
  3. getConstructor(Class<?>… parameterTypes) 返回指定公共构造函数
  4. getDeclaredConstructor(Class<?>… parameterTypes) 返回指定构造函数

            Class<?> aClass = Class.forName("com.hww.test.Info");
            Constructor<?>[] constructors = aClass.getConstructors();/*获取所有的公开构造方法*/
            Constructor<?>[] constructorsDec = aClass.getDeclaredConstructors();/*获取所有的构造方法*/

            System.out.println("获取所有的公开构造方法 === getConstructors");
            for (Constructor<?> constructor : constructors) {
                System.out.println(constructor);
            }
            System.out.println("获取所有的构造方法 === getDeclaredConstructors");
            for (Constructor<?> constructor : constructorsDec) {
                System.out.println(constructor);
            }

            Constructor<?> constructor = aClass.getConstructor();/*返回指定公共构造函数*/
            System.out.println("返回指定公共构造函数 === getConstructor    " + constructor);

            Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);/*返回指定构造函数*/
            System.out.println("返回指定构造函数 === getDeclaredConstructor    " + declaredConstructor);

            /*获取到构造方法后,初始化对象*/
            declaredConstructor.setAccessible(true);/*设置安全检查的标志位,true取消安全检查*/
            Object newInstance = declaredConstructor.newInstance("张三");
            System.out.println("通过构造方法创建对象:" + newInstance);

            /*该方法在java9中被标记为过时,推荐使用 clazz.getDeclaredConstructor().newInstance() */
            Object newInstance1 = aClass.newInstance();
            System.out.println("直接通过newInstance方法创建对象:" + newInstance1);


执行结果:
获取所有的公开构造方法 === getConstructors
public com.hww.test.Info(java.lang.String,int)
public com.hww.test.Info()
获取所有的构造方法 === getDeclaredConstructors
public com.hww.test.Info(java.lang.String,int)
private com.hww.test.Info(java.lang.String)
public com.hww.test.Info()
返回指定公共构造函数 === getConstructor    public com.hww.test.Info()
返回指定构造函数 === getDeclaredConstructor    private com.hww.test.Info(java.lang.String)
执行了private带参构造函数  参数内容:张三
通过构造方法创建对象:com.hww.test.Info@1c20c684
执行了public无参构造函数
直接通过newInstance方法创建对象:com.hww.test.Info@1fb3ebeb

获取成员变量

获取成员变量的方法

  1. getFields();/获取类中所有的public成员变量/
  2. getDeclaredFields();/获取类中所有的成员变量/
  3. getField(“age”);/获取类中指定的public成员变量/
  4. getDeclaredField(“name”);/获取类中指定的成员变量/

/*获取类的所有成员变量*/
        Field[] fields = aClass.getFields();/*获取类中所有的public成员变量*/
        System.out.println("获取类中所有的public成员变量: getFields");
        for (Field field : fields) {
            System.out.println(field);
        }
        Field[] declaredFields = aClass.getDeclaredFields();/*获取类中所有的成员变量*/
        System.out.println("获取类中所有的成员变量: getDeclaredFields");
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        Field field = aClass.getField("age");/*获取类中指定的public成员变量*/
        System.out.println("获取类中指定的public成员变量 getField : " + field);
        Field declaredField = aClass.getDeclaredField("name");/*获取类中指定的成员变量*/
        System.out.println("获取类中指定的成员变量 getDeclaredField : " + declaredField);

        /*获取成员变量的值或修改成员变量的值*/
        Constructor declaredConstructor = aClass.getDeclaredConstructor();/*获取一个无参构造函数*/
        Object newInstance = declaredConstructor.newInstance();/*创建对象*/
        System.out.println("修改前对象的内容:" + newInstance.toString());
        declaredField.setAccessible(true);/*设置安全检查的标志位,true取消安全检查*/
        declaredField.set(newInstance, "李四");
        System.out.println("修改后对象的内容:" + newInstance.toString());

        /*单独获取成员变量的值*/
        Object get = declaredField.get(newInstance);
        System.out.println("单独获取成员变量的值: " + get);


执行结果:
获取类中所有的public成员变量: getFields
public int com.hww.test.Info.age
获取类中所有的成员变量: getDeclaredFields
private java.lang.String com.hww.test.Info.name
public int com.hww.test.Info.age
获取类中指定的public成员变量 getField : public int com.hww.test.Info.age
获取类中指定的成员变量 getDeclaredField : private java.lang.String com.hww.test.Info.name
执行了public无参构造函数
修改前对象的内容:Info{name='null', age=0}
修改后对象的内容:Info{name='李四', age=0}
单独获取成员变量的值: 李四

#获取成员方法
获取成员方法:文章来源地址https://www.toymoban.com/news/detail-437329.html

  1. getMethods();/该方法返回类中所有的公共方法,包括由类或接口声明的对象,以及超类和超级接口继承的类/
  2. getDeclaredMethods();/该方法返回类中定义所有的方法,不包括继承方法/
  3. getMethod(“show3”, String.class);/返回一个指定方法名的公共方法对象 参数1:方法的名称 参数2:参数数组/
  4. getDeclaredMethod(“show1”);/返回一个指定方法名的方法对象 参数1:方法的名称 参数2:参数数组/

Method[] methods = aClass.getMethods();/*该方法返回类中所有的公共方法,包括由类或接口声明的对象,以及超类和超级接口继承的类*/
        System.out.println("获取类中所有公共方法,包含继承类的  getMethods ");
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("该方法返回类中定义所有的方法,不包括继承方法  getDeclaredMethods ");
        Method[] declaredMethods = aClass.getDeclaredMethods();/*该方法返回类中定义所有的方法,不包括继承方法*/
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }

        Object o = aClass.getDeclaredConstructor().newInstance();/*通过无参构造创建一个对象*/
        Method method = aClass.getMethod("show3", String.class);/*返回一个指定方法名的公共方法对象    参数1:方法的名称 参数2:参数数组*/
        Object invoke = method.invoke(o, "张三");
        System.out.println("invoke 调用有参有返回内容接口,返回值:" + invoke);

        /*执行无参无返回值的private方法  需要注意的是,调用无参方法的时候参数2可以不需要填写内容或填写null*/
        Method method1 = aClass.getDeclaredMethod("show1",null);/*返回一个指定方法名的方法对象    参数1:方法的名称 参数2:参数数组*/
        method1.setAccessible(true);/*设置安全检查的标志位,true取消安全检查*/
        Object invoke1 = method1.invoke(o);/*当前方法无返回值,创建了接收对象,内容为null*/
        System.out.println("invoke 调用无参无返回的private方法成功" + invoke1);

执行结果:
获取类中所有公共方法,包含继承类的  getMethods 
public java.lang.String com.hww.test.Info.toString()
public void com.hww.test.Info.show2(java.lang.String)
public java.lang.String com.hww.test.Info.show3(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 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()
该方法返回类中定义所有的方法,不包括继承方法  getDeclaredMethods 
public java.lang.String com.hww.test.Info.toString()
private void com.hww.test.Info.show1()
public void com.hww.test.Info.show2(java.lang.String)
public java.lang.String com.hww.test.Info.show3(java.lang.String)
执行了public无参构造函数
===>执行 show3 方法    参数内容:张三
invoke 调用有参有返回内容接口,返回值:show3返回的内容
===>执行 show1 方法
invoke 调用无参无返回的private方法成功null

Process finished with exit code 0


测试中使用到的类对象


package com.hww.test;

public class Info {
    private String name;
    public int age;

    public Info() {
        System.out.println("执行了public无参构造函数");
    }

    private Info(String name) {
        this.name = name;
        System.out.println("执行了private带参构造函数  参数内容:" + name);
    }

    public Info(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("执行了public带参构造函数  参数内容,name=" + name + " age=" + age);
    }


    private void show1() {
        System.out.println("===>执行 show1 方法");
    }

    public void show2(String str) {
        System.out.println("===>执行 show2 方法    " + str);
    }

    public String show3(String str) {
        System.out.println("===>执行 show3 方法    参数内容:" + str);
        return "show3返回的内容";
    }

    @Override
    public String toString() {
        return "Info{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

到了这里,关于Java 反射浅析与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java的反射应用(Method和Class)

    记录 :473 场景 :使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。 版本 :JDK 1.8。 1.使用Java反射调用指定类的指定方法 (1)参数说明 String className, 字符串类型,需反射的类的全路径。 String methodName, 字

    2024年02月08日
    浏览(34)
  • 使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

    1.可能是编译的时候后缀带了.class:把后缀去掉; 2.可能是因为你的java文件带了package包,原因是:我们在包里运行文件,在运行文件的时候又找了一次包,可是我们已经在包里了,自然找不到主类了。 针对第二种错误解决方法有两种: 方法一:把java文件中的包删掉或者注释

    2024年02月15日
    浏览(42)
  • 反射 p2 Class类

    Class也是类,因此也继承Object类; Class类对象不是new出来的,而是系统创建的; 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次; 每个类的实例都会记得自己是由哪个Class实例所生成的; 通过Class对象可以完整的得到一个类的完整结构,通过一系列API; Cla

    2024年02月16日
    浏览(28)
  • Java面试题Class类的理解?创建类的对象的方式?

    1.类的加载过程: 程序经过 javac.exe 命令以后,会生成一个或多个字节码文件(.class结尾)。 接着我们使用 java.exe 命令对某个字节码文件进行解释运行。相当于将某个字节码文件 加载到内存中。此过程就称为类的加载 。加载到内存中的类,我们就称为运行时类,此运行时类,

    2024年02月10日
    浏览(27)
  • Java 反射浅析与使用

    加载class的方式 通过Class.forName(className) className:全类名(类包名+类名) 通过类名.class方法获取 通过对象的getClass()方法获取 获取构造函数的方法 getConstructors() 返回该类声明的所有公共构造函数 getDeclaredConstructors() 返回该类声明的所有构造函数 getConstructor(Class?… parameterTypes) 返

    2024年02月03日
    浏览(25)
  • 【Java反射】Java利用反射获取和设置对象某属性的值

    通用工具类: 测试:

    2024年02月02日
    浏览(41)
  • Java 反射设置/获取对象属性值

    ✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨ 欢迎对【Java】感兴趣的大佬,关注我 😜 ———————————————— ❤️ ❤️ ❤️ 如果觉得本文还不错,点赞 + 评论 + 关注 + 收藏。有补充欢迎评论交流,我将努力创作更多更好的文章。 大佬们的支持

    2024年02月07日
    浏览(41)
  • Java反射:探索对象创建与类信息获取

    🎉欢迎来到Java学习路线专栏~Java反射:探索对象创建与类信息获取 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限

    2024年02月09日
    浏览(29)
  • JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装

    ​1、JDBC的六大步骤 (导入jar包, 加载驱动类,获取连接对象, 获取sql执行器、执行sql与并返回结果, 关闭数据库连接) 2、​封装了一个DBUtil 类, 通过读取属性文件的方式获取 基础连接信息。 3、​批量添加: 一次性可执行多个添加记录 ,将多个sql语句在当前这次连接

    2024年02月13日
    浏览(37)
  • Java 基础进阶篇(十七):反射概述及获取对象的方式

    反射是指对于任何一个Class类,在 “运行的时候”,不用创建对象,就可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种

    2024年02月07日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包