文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-02 08:08

关注

这篇文章主要介绍了Java怎么通过反射获取Constructor、Field、Method对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么通过反射获取Constructor、Field、Method对象文章都会有所收获,下面我们一起来看看吧。

前言

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

Constructor:表示类中的构造方法

Field:表示类中的属性

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 +                '}';    }}

 获取成员变量:

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

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

获取本类中的全部属性: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怎么通过反射获取Constructor、Field、Method对象”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯