反射

转自:https://blog.csdn.net/sinat_38259539/article/details/71799078

概述:
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。如图:
在这里插入图片描述

在API中的详解:
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
1.获取class对象的三种方式:
1.Object ——> getClass();
2. 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
3. 通过Class类的静态方法:forName(String className)(常用)

三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

2.通过反射获取构造方法并使用:
获取构造方法:
1).批量的方法:
public Constructor[] getConstructors():所有”公有的”构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
2).获取单个的方法,并调用:
public Constructor getConstructor(Class… parameterTypes):获取单个的”公有的”构造方法:
public Constructor getDeclaredConstructor(Class… parameterTypes):获取”某个构造方法”可以是私有的,或受保护、默认、公有;
例:con = clazz.getDeclaredConstructor(char.class);

调用构造方法:
Constructor–>newInstance(Object… initargs)
newInstance是 Constructor类的方法(管理构造函数的类)
api的解释为:
newInstance(Object… initargs)使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用

3.获取成员变量并调用:
获取成员变量:
1.批量的
1).Field[] getFields():获取所有的”公有字段”
2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
2.获取单个的:
1).public Field getField(String fieldName):获取某个”公有的”字段;
2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

调用成员变量:
Object obj = stuClass.getConstructor().newInstance(); //产生Student对象–》Student stu = new Student();
f.set(obj, ”小汪”); //为Student对象中的name属性赋值–》stu.name = ”小汪”

设置字段的值:
Field –> public void set(Object obj,Object value):
参数说明:
1.obj:要设置的字段所在的对象;
2.value:要为字段设置的值;

4.获取成员方法并调用:
获取成员方法并调用:

1.批量的:
public Method[] getMethods():获取所有”公有方法”;(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
2.获取单个的:
public Method getMethod(String name,Class<?>… parameterTypes):
参数:
name : 方法名;
Class … : 形参的Class类型对象
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)

调用方法:
Method –> public Object invoke(Object obj,Object… args):
参数说明:
obj : 要调用方法的对象;
args:调用方式时所传递的实参;

m = stuClass.getDeclaredMethod(“show4”, int.class);//调用制定方法(所有包括私有的),需要传入两个参数,第一个是调用的方法名称,第二个是方法的形参类型,切记是类型。
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

5.反射main方法:
获取main方法:
Method methodMain = clazz.getMethod(”main”, String[].class); //第一个参数:方法名称,第二个参数:方法形参的类型,
调用main方法:
methodMain.invoke(null, (Object)new String[]{“a”,“b”,“c”});//方式一
// methodMain.invoke(null, new Object[]{new String[]{“a”,”b”,”c”}});//方式二
第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数。这里拆的时候将 new String[]{“a”,”b”,”c”} 拆成3个对象。。。所以需要将它强转。

6.反射方法的其它使用之—通过反射运行配置文件内容:
我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改。我们只需要将新类发送给客户端,并修改配置文件即可。

7.反射方法的其它使用之—通过反射越过泛型检查:
泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值