我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何通过反射获取Constructor、Field、Method对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何通过反射获取Constructor、Field、Method对象

前言

在实际开发中,通过反射可以得到一个类的完整结构,包括类的构造方法、类的属性、类的方法,这就需要使用到java.lang.reflect包中的以下几个类:

1、Constructor:表示类中的构造方法

2、Field:表示类中的属性

3、Method:表示类中的方法

使用反射技术获取构造器对象并使用

实验类:

public class 反射机制_2实验类 {
    private String name;
    private int age;
 
    private 反射机制_2实验类() {
        System.out.println("无参构造器执行!");
    }
 
    public 反射机制_2实验类(String name, int age) {
        System.out.println("有参构造器执行!");
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "反射机制_2实验类{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 获取构造器对象:

import org.junit.Test;
 
import java.lang.reflect.Constructor;
 
public class 反射机制_2构造器获取对象 {
    //1、getConstructors
    //获取全部的构造器,只能获取public修饰的构造器
    @Test
    public void getConstructors(){
        //获取类对象
        Class c=反射机制_2实验类.class;
        //提取类中的全部的构造器对象(这里只能拿public修饰的构造器)
        Constructor[] constructors=c.getConstructors();
        //遍历构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"\t构造器参数个数为:"+constructor.getParameterCount()+"个");
        }
        //运行结果:IT2.反射机制_2实验类    构造器参数个数为:2个
    }
 
    //2、getDeclaredConstructors
    //获取全部的构造器:只要你敢写,这里就能拿到,无所谓权限是否可及
    @Test
    public void getDeclaredConstructors(){
        //获取类对象
        Class c=反射机制_2实验类.class;
        //提取类中的全部的构造器对象
        Constructor[] constructors=c.getDeclaredConstructors();
        //遍历构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"\t构造器参数个数为:"+constructor.getParameterCount()+"个");
        }
        //运行结果:
        // IT2.反射机制_2实验类    构造器参数个数为:0个
        // IT2.反射机制_2实验类    构造器参数个数为:2个
    }
 
    //3、getConstructor
    //获取某个构造器:只能拿Public修饰的某个构造器
    @Test
    public void getConstructor() throws Exception {
        //获取类对象
        Class c=反射机制_2实验类.class;
        //定位单个构造器对象(按照参数,这里定位的是有参的构造器)
        Constructor cons=c.getConstructor(String.class,int.class);
       // Constructor cons=c.getConstructor();//如果获取无参构造器,但因为我设置的是private私有的,权限不足无法获取,便会报错
        System.out.println(cons.getName()+"\t构造器参数个数为:"+cons.getParameterCount()+"个");
        //运行结果:IT2.反射机制_2实验类    构造器参数个数为:2个
    }
    //4、getDeclaredConstructor
    //获取某个构造器:只要你敢写,这里就能拿到,无所谓权限是否可及
    //一般是用这个,什么都可以获取,并且是根据自己需要什么而获取
    @Test
    public void getDeclaredConstructor() throws Exception {
        //获取类对象
        Class c=反射机制_2实验类.class;
        //定位单个构造器对象(按照参数,这里定位的是有参的构造器)
        Constructor cons=c.getDeclaredConstructor(String.class,int.class);
        System.out.println(cons.getName()+"\t构造器参数个数为:"+cons.getParameterCount()+"个");
        //运行结果:IT2.反射机制_2实验类    构造器参数个数为:2个
 
        //获取类对象
        Class c2=反射机制_2实验类.class;
        //定位单个构造器对象(按照参数定位无参构造器)
        Constructor cons2=c2.getDeclaredConstructor();
        System.out.println(cons2.getName()+"\t构造器参数个数为:"+cons2.getParameterCount()+"个");
        //运行结果:IT2.反射机制_2实验类    构造器参数个数为:0个
    }
}

Class在开发中最常见的用法就是将Class类对象实例化为自定义类的对象,即可通过一个给定的字符串(类的全限定类名)实例化一个本类的对象。将Class对象实例化为本类对象时,可以通过无参构造完成,也可以通过有参构造完成。 

创建对象:

import org.junit.Test;
import java.lang.reflect.Constructor;
 
//反射可以破坏封装性,私有的也可以执行了
public class 反射机制_2创建对象 {
    @Test
    public void getDeclaredConstructor() throws Exception {
        //获取类对象
        Class c=反射机制_2实验类.class;
        //定位单个构造器对象(按照参数,这里定位的是有参的构造器)
        Constructor cons=c.getDeclaredConstructor(String.class,int.class);
        System.out.println(cons.getName()+"\t构造器参数个数为:"+cons.getParameterCount()+"个");
        反射机制_2实验类 s1= (反射机制_2实验类) cons.newInstance("狗蛋",18);
        System.out.println(s1);
        System.out.println();
 
        //获取类对象
        Class c2=反射机制_2实验类.class;
        //定位单个构造器对象(按照参数定位无参构造器)
        Constructor cons2=c2.getDeclaredConstructor();
        System.out.println(cons2.getName()+"\t构造器参数个数为:"+cons2.getParameterCount()+"个");
 
        //如果遇到了私有的构造器,可以暴力反射
        cons2.setAccessible(true);//权限打开(只是这一次有效,并不是一直打开)
 
        反射机制_2实验类 s2= (反射机制_2实验类) cons2.newInstance();
        System.out.println(s2);
 
        //运行结果:
        //IT2.反射机制_2实验类    构造器参数个数为:2个
        //有参构造器执行!
        //反射机制_2实验类{name='狗蛋', age=18}
        //
        //IT2.反射机制_2实验类    构造器参数个数为:0个
        //无参构造器执行!
        //反射机制_2实验类{name='null', age=0}
    }
}

使用反射技术获取成员变量对象并使用

实验类:

public class 反射机制_2实验类2 {
    private String name;
    private int age;
    public static String schoolName;
    public static final String Name="遇安";
 
    public 反射机制_2实验类2() {
        System.out.println("无参构造器执行!");
    }
 
    public 反射机制_2实验类2(String name, int age) {
        System.out.println("有参构造器执行!");
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public static String getSchoolName() {
        return schoolName;
    }
 
    public static void setSchoolName(String schoolName) {
        反射机制_2实验类2.schoolName = schoolName;
    }
 
    @Override
    public String toString() {
        return "反射机制_2实验类2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 获取成员变量:

在反射操作中可以获取一个类中的全部属性,但是类中的属性包括两部分,即从父类继承的属性和本类定义的属性。因此,在获取类的属性时也有以下两种不同的方式:

1、获取实现的接口或父类中的公共属性:public Field [] getFields throws SecurityException

2、获取本类中的全部属性:public Field [] getDeclaredFields throws Exception

上述两种方法返回的都是Field数组,每一个Field对象表示类中的一个属性。如果要获取属性中的详细信息,就需要调用Field类的方法。

import org.junit.Test;
 
import java.lang.reflect.Field;
 
public class 反射机制_2获取成员变量 {
    //1、获取全部的成员变量
  //  Field[] getDeclaredFields
    //获得所有的成员变量对应的Field对象,只要申明了就可以得到
    @Test
    public void getDeclaredFields(){
        //定位Class对象
        Class c=反射机制_2实验类2.class;
        //定位全部成员变量
        Field [] fields=c.getDeclaredFields();
        //遍历获取,常量也会被当做成员变量
        for (Field field : fields) {
            System.out.println(field.getName()+"的类型是:"+field.getType());
        }
    }
 
    //2、获取某个成员变量对象
    //Field getDeclaredField(String name)
    @Test
    public void getDeclaredField() throws Exception {
        //定位Class对象
        Class c=反射机制_2实验类2.class;
        //根据名称定位某个成员变量
        Field f=c.getDeclaredField("age");
        System.out.println(f);
        System.out.println(f.getName()+"的类型是:"+f.getType());
    }
}

运行结果:

Test1、

name的类型是:class java.lang.String
age的类型是:int
schoolName的类型是:class java.lang.String
COUNTTRY的类型是:class java.lang.String 

Test2、

private int IT2.反射机制_2实验类2.age
age的类型是:int

 获取了成员变量有什么用呢?

import org.junit.Test;
 
import java.lang.reflect.Field;
 
public class 反射机制_2获取成员变量 {
    //获取了成员变量有什么用呢?
    @Test
    public void demo() throws Exception {
        //反射第一步获取Class对象
        Class c=反射机制_2实验类2.class;
        //提取某个成员变量
        Field f=c.getDeclaredField("age");
 
        f.setAccessible(true);//因为我的age成员变量是用private修饰的,所以需要暴力打开权限
 
        //作用一:赋值
        反射机制_2实验类2 s=new 反射机制_2实验类2();
        f.set(s,18);//s.setAge(18);
        System.out.println(s);
        //运行结果:
        // 无参构造器执行!
        //反射机制_2实验类2{name='null', age=18}这里可以看出,成员变量被赋值成功
 
        //作用二:取值
        int age = (int) f.get(s);
        System.out.println(age);//18
    }
}

使用反射技术获取方法对象并使用

实验类:

public class 反射机制_2实验类3 {
    private String name;
 
    public 反射机制_2实验类3() {
 
    }
 
    public 反射机制_2实验类3(String name) {
        this.name = name;
    }
    public void run(){
        System.out.println("跑起来了。。");
    }
 
    private void eat(){
        System.out.println("累了,该吃饭了。。");
    }
    private String eat(String name){
        System.out.println("那就浅吃一下"+name+"吧");
        return "针不戳";
    }
    public static void ind(){
        System.out.println("欢迎来到遇安的博客!");
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

 获取成员方法:

import org.junit.Test;
 
import java.lang.reflect.Method;
 
public class 反射机制_2获取成员方法 {
    //获得类中的所有成员方法对象
    @Test
    public void getDeclaredMethods(){
        //获取类对象
        Class c=反射机制_2实验类3.class;
        //提取全部方法,包括私有的
        Method [] methods=c.getDeclaredMethods();
        //遍历全部方法
        for (Method method : methods) {
            System.out.println(method.getName()+"返回值类型:"+method.getReturnType()+"参数个数:"+method.getParameterCount());
        }
    }
    //提取某个方法对象
    @Test
    public void getDeclaredMethod() throws Exception {
        //获取类对象
        Class c=反射机制_2实验类3.class;
        //提取单个方法对象
        Method m1=c.getDeclaredMethod("eat");
        Method m2=c.getDeclaredMethod("eat",String.class);
 
        //暴力打开权限
        m1.setAccessible(true);
        m2.setAccessible(true);
 
        //触发方法的执行
        反射机制_2实验类3 s=new 反射机制_2实验类3();
        //注意:如果方法是没有结果返回的,那么返回的是Null
        Object result =m1.invoke(s);
        System.out.println(result);
 
        Object result2=m2.invoke(s,"海鲜大餐");
        System.out.println(result2);
    }
}

运行结果:

累了,该吃饭了。。
null
那就浅吃一下海鲜大餐吧
针不戳

总结

到此这篇关于Java如何通过反射获取Constructor、Field、Method对象的文章就介绍到这了,更多相关Java反射获取对象内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何通过反射获取Constructor、Field、Method对象

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

下载Word文档

猜你喜欢

Java怎么通过反射获取Constructor、Field、Method对象

这篇文章主要介绍了Java怎么通过反射获取Constructor、Field、Method对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么通过反射获取Constructor、Field、Metho
2023-07-02

Java如何通过反射获取对象的属性和值

Java反射允许程序在运行时获取对象的属性和值。通过获取类的Class对象,可以遍历字段并获取字段名称。要获取属性值,需要获取Field对象,设置可访问性并获取值。示例代码展示了如何获取Person对象属性和值的反射使用。需要注意反射操作可能影响性能,需要谨慎使用。
Java如何通过反射获取对象的属性和值
2024-04-02

java如何制作反射对象的获取

小编给大家分享一下java如何制作反射对象的获取,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java.lang.Class对象的获取方式现金盘系统制作q<115
2023-06-02

Java中如何通过反射获取类的信息

这篇文章主要为大家展示了Java中如何通过反射获取类的信息,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Java中如何通过反射获取类的信息”这篇文章吧。Java的特点有哪些Java的特点有哪些1.
2023-06-06

Java如何通过反射获取非静态内部类

这篇“Java如何通过反射获取非静态内部类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何通过反射获取非静态内部类
2023-07-05

java利用反射机制如何实现获取对象的值

本篇文章给大家分享的是有关java利用反射机制如何实现获取对象的值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。通过反射机制得到对象中的属性和属性值 在对象中private没问
2023-05-31

Java如何利用反射对list对象做过滤

小编给大家分享一下Java如何利用反射对list对象做过滤,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!反射对效率有影响 慎用!!!1.对象结构public class BusinessDept {private Stri
2023-06-29

Java怎么通过反射获取私有构造、私有对象、私有字段、私有方法

这篇文章主要介绍了Java怎么通过反射获取私有构造、私有对象、私有字段、私有方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java反射获取私有构造、私有对象、私有字段、私
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录