概述:

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

本文链接:http://blog.csdn.net/lemon_tree12138/article/details/49871515 -- Coding-Naga
                                                                 --转载请注明出处

反射的基本操作:

1.获得类名

通过Java的反射机制我们可以获得一个对象的类。这里的类是类的全名,包含包名。比如:org.demo.reflect.Clazz.

可能你会问,这个功能有什么用?其实这个功能还是很有用的。比如,我们在打日志的时候,我们就要用到这个功能,来追踪这个日志是在什么地方被打出来的。

private String getObjectName(Object o) {if (o == null) {return null;}return o.getClass().getName();}

2.输出一个类的所有对外可见的变量

注意这里是输出所有对外可见的变量,即变量的修饰符为public.这里使用的是getFields()方法。注意,这里是可以获得其父类中的public变量.

private void printFields(String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}} catch(ClassNotFoundException e) {e.printStackTrace();}}

3.输出一个类的所有成员变量

这里是输出一个类的成员变量,不论它是不是对外可见的。就算它是被private修饰,也同样可见。这一点很让人着迷,不是吗?

这里使用的是getDeclaredFields()。

private void printDeclaredFields(String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(field);}} catch(ClassNotFoundException e) {e.printStackTrace();}}

4.输出一个类的所有public方法

这里与之前的getFields()类似只能对外可见的,即修饰符为public的方法。同样,这里也是可以获得父类的public方法。

private void printMethods(String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}} catch(ClassNotFoundException e) {e.printStackTrace();}}

5.输出一个类的所有成员方法

private void printDeclaredMethods(String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}} catch(ClassNotFoundException e) {e.printStackTrace();}}

6.调用类里面的成员函数

这里我先假设测试类中有一个sayHello方法,如下:

public void sayHello(String from) {System.out.println("Hello from " + from);
}

下面就可以通过getMethod()方法来反射获得这个sayHello方法。getMethod()中第一个参数为方法名,这里即是"sayHello",后面的参数是可变量参数,是可以填写0个或是多个的,值为被反射的方法中的参数类型。这里即是String.class。

然后再调用invoke()方法,invoke()的第一个参数为被反射的对象,后面是向sayHello()方法中传递的数据。具体过程如下:

private void callMethod(Object o, String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Method method = clazz.getMethod("sayHello", String.class);method.invoke(o, TestReflect.class.getSimpleName());} catch(Exception e) {e.printStackTrace();}}

7.生成一个不能new的对象

可以看到上面的操作过程,都有一个前提,就是我们已经有了这个对象。那如果我们之前没有这个对象呢?或者说,我们不能显式地获得这个对象。这一点在学习单例模式的时候,就知道其实很好获得,只要把重写默认的构造方法,并把这个构造方法的修饰符修改为private即可。如下:

private PrivateClass() {
}

这里有一点比较特殊,就是这里使用的类或是方法都是私有的。我们不能直接去使用他们,在使用他们之前,需要设置其可访问性为true。具体操作过程如下:

private void newPrivateClass(String clazzName) {try {Class<?> clazz = Class.forName(clazzName);Constructor<?> constructor = clazz.getDeclaredConstructor();constructor.setAccessible(true);PrivateClass privateClass = (PrivateClass)constructor.newInstance();Method method = clazz.getDeclaredMethod("sayHello");method.setAccessible(true);method.invoke(privateClass);} catch (Exception e) {e.printStackTrace();}}

GitHub源码连接:

https://github.com/William-Hai/TestReflect

Java反射机制浅析相关推荐

  1. 【Java】Java 反射机制浅析

    1.概述 转载:https://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html Java反射机制是在运行状态中,对于任意一个类,都能够知 ...

  2. Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

    Java反射机制大神必学系列之 ,高级与低级的差别在哪里? java学习爱好者 2019-05-20 19:08 前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来 ...

  3. Java基础与提高干货系列——Java反射机制

    前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...

  4. java 反射 Gc_深入浅析Java反射机制

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

  5. java 反射机制详解

    火星十一郎 海纳百川, 有容乃大,QQ:791909235,Tel:13137910179 posts - 774, comments - 556, trackbacks - 0, articles ...

  6. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  7. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  8. Java反射机制分析指南

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  9. 反射 字段_详解面试中常考的 Java 反射机制

    反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...

最新文章

  1. mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?
  2. 生活只是需要一种积极的态度
  3. linux:系统对open files的限制
  4. matlab win10 gpu加速,win10的Edge浏览器设置GPU硬件加速,大幅度提升浏览器性能
  5. 大数据建模、分析、挖掘技术应用研修班的通知
  6. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用
  7. Android学习总结(1)——好的 Android 开发习惯
  8. lsof命令_lsof命令的部分说明
  9. hdu 1198农田灌溉
  10. oracle mysql认证考试流程_Oacle认证考试:Oracle移植到MySQL注意事项
  11. 华硕A55V,终于解决了无线网指示灯不亮的问题。
  12. windows 2008 配置php_Windows 2008 R2 下IIS7.5+PHP5.2环境配置(FastCgi设置)
  13. 迪普融合之路 构建价值网络
  14. MySQL查询数据---单表查询
  15. dnw for linux
  16. 科创板拟上市企业申联生物和传音控股已提交注册
  17. 求一个整数的各个位数
  18. 几种基本的约束和外键(一对一 多对多 多对一)级联关系
  19. java调用扫描仪识别文字_Java使用扫描仪读取文件输入
  20. jquery slider_使用jQuery UI Slider创建音量控制器

热门文章

  1. 以太坊节点布置(3) 启动geth客户端
  2. [思考]-32位的应用程序为什么不能跑64位的应用程序
  3. [How TO]-virtualbox下安装ubuntu14.04超详细
  4. 通过ngrok在内网捕获meterpreter反弹
  5. 3、CSS 边框border
  6. 1.2 @Override注解
  7. 验证用户身份Filter过滤器
  8. Acwing第 25 场周赛【完结】
  9. Quartz整合Spring
  10. 欧拉公式cos_谈谈欧拉公式与复指数信号