博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的反射机制
阅读量:6590 次
发布时间:2019-06-24

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

前言:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

Java反射的使用:

有如下student类:

public class Student {    private int age;    private String name;        public Student() {         super();    }    public Student(int age, String name) {        super();        this.age = age;        this.name = name;    }    public void study() {        System.out.println("测试反射!");    }}

现在通过反射来获取student类的信息:

一、获取class对象
获取class对象有三种方式,如下:
1、方式一:

Class clazz =Class.forName("com.demos.reflect.Student");

注意:forName里面的参数是Student的全类名。

2、方式二:

Class clazz = Student.class;

3、方式三:

Class clazz = stu.getClass();

注:这种方法是已有该类的对象时使用,即已有stu对象。

二、获取类的信息

得到了Class对象后,就可以通过Class对象获取类的信息,部分方法如下:
1、获取属性:

Field[] fs = clazz.getDeclaredFields();//获取所有属性        for(Field f : fs) {            //获取属性名            System.out.println(f.getName());            //获取属性的数据类型            Class pp = f.getType();            System.out.println(pp.getName());//类型带包名            //System.out.println(pp.getSimpleName());//不带包名        }

2、获取类的方法:

//拿单个方法(study方法有参数的话还得写上参数类型,        //例如:clazz.getMethod("study",String.Class))        //Method m = clazz.getMethod("study");//获取单个方法        //Method[] ms = clazz.getMethods();//包括父类方法        Method[] ms = clazz.getDeclaredMethods();//不包括父类方法        for(Method m : ms) {            //获取类的方法名            System.out.println(m.getName());        }

三、动态创建对象,调用方法

1.1、创建对象方式一:

Object obj = clazz.newInstance();System.out.println(obj);

注意:这种方式创建对象因为没传参数,所以Student类必须要有一个无参构造。

1.2、创建对象方式二:

Constructor cos = clazz.getConstructor(int.class,String.class);    Object obj2 = (Student)cos.newInstance(20,"张三");System.out.println(obj2);

注意:这种方式带参创建对象,需要有带参构造。

2、调用方法:

有了对象就可以调该类的方法,如下:

Method m = clazz.getMethod("study");m.invoke(obj);
img_2977e3b9900081d27dd152c931c85797.png
图片发自简书App

控制台输出输出"测试反射",正是study方法里打印的那句话。

总结:

Java的反射机制应用非常广泛,像spring、hibernate等框架底层都用到了反射,理解反射机制,可以帮助我们更好的理解这些框架的原理。

以上内容属于个人笔记整理,如有错误,欢迎批评指正!

转载地址:http://oyuio.baihongyu.com/

你可能感兴趣的文章
如何写出兼容大部分浏览器的CSS 代码
查看>>
第二阶段冲刺第八天,6月7日。
查看>>
java的左移位(<<)和右移位(>>)和无符号右移(>>>)
查看>>
struts2 action 返回类型分析
查看>>
【原创】FPGA开发手记(三) PS/2键盘
查看>>
linux统计多个文件大小总和
查看>>
java基础-Eclipse开发工具介绍
查看>>
JS常见的字符串操作
查看>>
洛谷P1069 细胞分裂 数学
查看>>
JAVA中的编码分析
查看>>
查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
查看>>
document.all用法
查看>>
uniGUI试用笔记(二)
查看>>
HOG特征-理解篇
查看>>
Microsoft.AlphaImageLoader滤镜解说
查看>>
extjs_02_grid(显示本地数据,显示跨域数据)
查看>>
超过响应缓冲区限制
查看>>
ubuntu 下安装 matplotlib
查看>>
webservice的几个简单概念
查看>>
underscore 1.7.0 api
查看>>