博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 通过反射获取调用类方法及属性
阅读量:5977 次
发布时间:2019-06-20

本文共 2220 字,大约阅读时间需要 7 分钟。

hot3.png

首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中

反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性。

ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧

 Student类

public class Student {    public String name;    public String gender;    public int age;        public Student(){            }}

使用反射获取类的实例

public class Test {    public static void main(String[] args)throws ReflectiveOperationException {        //通过三种方式获取类的类对象        Class
 c=Student.class;        Class
 c1=new Student().getClass();        Class
 c2=Class.forName("Student");//通过包名.类名获取类对象(因为该类在default包,所以可以不写包名)        //通过类对象来构建student实例,效果和new  Student()一样,要求Student中必须要有无参的构造函数        Student s=(Student) c.newInstance();        Student s1=(Student) c1.newInstance();        Student s2=(Student) c2.newInstance();                        s.age=1;        s1.age=2;        s2.age=3;                        System.out.println(s.age);        System.out.println(s1.age);        System.out.println(s2.age);    }

可以看到,正确的输出了1,2,3

技术分享

通过反射获取类的属性及方法,动态执行

   最流行的java后台框架 springmvc mybaits 

Student类型

public class Student {    public String name;    private int age;//该属性为私有,可以通过反射获取得到        public Student(){            }        public int add(int a,int b){        return a+b;    }        @Override    public String toString() {        // TODO Auto-generated method stub        return "name="+name+"\nage="+age;    }}

 

动态的给类的属性赋值和调用类的方法

public class Test {    public static void main(String[] args)throws ReflectiveOperationException {        //获取类对象        Class
 c=Class.forName("Student");                //获取类的属性对象,需要填写属性对象的名称        Field f1=c.getField("name");//只能获取public的对象        Field f2=c.getDeclaredField("age");//可以获取到private的对象,这很吊吧                        f2.setAccessible(true);//如果属性是私有的,那么就需要设置可访问        Student s1=(Student) c.newInstance();        //为属性对象赋值        f1.set(s1, "张三");        f2.set(s1, 22);                System.out.println(s1.toString());                //通过类对象获取类的方法        Method m1=c.getMethod("add", int.class,int.class);                //动态的执行方法        int sum=(int) m1.invoke(s1, 1,2);        System.out.println(sum);                    }}

 

转载于:https://my.oschina.net/jiuwanbq5/blog/632732

你可能感兴趣的文章
javascript数学运算符
查看>>
LC.155. Min Stack(非优化,两个stack 同步 + -)
查看>>
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
redis主从配置<转>
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
利用console控制台调试php代码
查看>>
讲解sed用法入门帖子
查看>>
Linux 内核已支持苹果
查看>>
shell脚本逻辑判断,文件目录属性判断,if,case用法
查看>>
【二叉树系列】二叉树课程大作业
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
hbase region split源码分析
查看>>
MySQL备份之分库分表备份脚本
查看>>
Java 与 Netty 实现高性能高并发
查看>>
SurfControl人工智能新突破 领跑反垃圾邮件
查看>>
一个动态ACL的案例
查看>>
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
Win server 2012 R2 文件服务器--(三)配额限制
查看>>