对java反射机制的一些理解

1.什么是java的反射机制?

说实话,一开始的时候我真的不知道什么是java的反射机制,反射机制又有什么用呢?甚至于在刚开始的时候,我还觉得java反射机制真的麻烦,还不如平常的使用类以及其实例对象还有方法等。但随着慢慢的理解以及了解,才发现其实java的反射机制还是很棒的,甚至于说这才是java的精髓所在,那么我们就一起来探讨一下吧:

反射(Reflection)机制:其实就是程序在运行的时候可以获取任意一个类的内部信息,也可以说是动态获取吧。

2.那么我们怎么利用反射(Reflection)去获取类的相关信息呢?

首先我们必须要了解什么是静态加载类,什么是动态加载类?

静态加载类:其实说的通俗一点的话,就是程序编译的的过程,这就是静态加载类。

动态加载类:其实说的就是程序运行的时候,可以说动态加载。

简单一点的说法就是:编译--------静态      运行---------动态

我们在控制台运行java程序的时候是不是要执行一下:javac *.java(其实这个时候会生成一个该类的.class文件) 然后再java *(这个时候其实运行加载的就是这个.class文件),而所谓的动态加载,就是绕过编译,在调用的时候就运行。下面通过一个简单的例子来说明一下:

比如我新建一个类:         

package com.mytest01;

public class showObj {
	public void showObject(){
		Person p = new person();
		system.out.println(p);
}

还没有运行的时候在eclispe等软件是不是会提示报错?然后你在控制台中编译是不是不通过?说找不到这个Person这个类?

那么我们稍微改一下代码看看是否还会出错:

package com.mytest01;

public class showObj {
	public void showObject(){
		Class p = person.class;
		System.out.println(p);
}
	class person{
		
		}
	}
看看编译的时候还会不会出错?

下面我们再来谈一下我们到底应该怎么去获取类的内部信息呢?

在获取类的内部信息之前,我想说的是一点点面向对象的思想。首先什么是对象?我们常说一个实体就是一个对象,那么我们在想想java里面我们新建的类是不是一个对象呢?你可能会有疑问?对象不就还是类的实例化吗?为什么说类也是一个对象?其实也不难理解,因为我们所有新建的类其实都是java里面java.lang.Class的实例对象来的,新建一个类,其实就是实例化java.lang.Class类;

明白了这一点,我们就可以继续的往下走了,下面我们就来谈谈怎么去获取一个类的内部信息:

第一步:获取该类的类类型(这一步非常关键)

那么我们怎么去获取呢:

其实很简答,一共有三种方法:

1.利用Class c  = Class.forName("")----------传就来要获取类的路径,会出现异常。

2.利用Class c = A.class ---------------------A代表该类的类名

3.利用Class c = a.getClass();---------------a代表的就是该类的实例化对象,也就是 A a = new A();这一步

通过上面的方法我们就获取了该类的一个实例对象,那么我们怎么调用类里面的成员函数,成员变量呢?(注意都是public的)如果要访问私有的要在你要获取的变量后加上setAccessible(true);例如 Filed[] filed = c.getFields(); field.setAccessible(true);

其实还是很简单:

1.c.getName()-------------------获取该类的类名;返回String类型的值

2.c.getFileds()------------------------获取该类的所有成员变量   c.getDeclaredFields()--------自己声明的类的成员变量;

3.c.getType()---------------------------获取该类的类型

4.c.getMethods()----------------------获取所有的方法     c.getDeclaredMethod()-----------所有声明过的方法。

.......

.....

..

还有很多可以去查阅官方的文档。

那么我们怎么反向的去执行方法呢?

分为三步:

第一:获取类的;类类型

Class c = a.getClass();

第二步:获取类的方法

Method m = c.getMethod("方法的名称",参数的类类型new Class[]{...,.....});

第三部:传入参数,利用invoke()函数

Object  o = m.invoke(a(实例化对象),执行函数要传进来的参数);

好了,上面就是一些java反射的浅层应用以及讲解。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值