博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用反射获取对象的步骤
阅读量:5221 次
发布时间:2019-06-14

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

  • 获取类的Class对象实例
Class clz = Class.forName("com.reflect.Apple");
  • 根据Class对象实例获取Constructor对象
Constructor appleConstructor = clz.getConstructor();
  • 使用 Constructor对象的newInstance方法获取反射对象
Object appleObj = appleConstructor.newInstance();

而如果要调用某一个方法,则需要经过下面的步骤:

  • 获取方法的Method对象
Method setPriceMethod = clz.getMethod("setPrice", int.class);
  • 利用 invoke 方法调用方法
setPriceMethod.invoke(appleObj, 14);

获取反射中的Class对象

在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。

在 Java API 中,获取 Class 类对象有三种方法:

第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。

Class clz = Class.forName("java.lang.String");

第二种,使用 .class 方法。

这种方法只适合在编译前就知道操作的 Class。

Class clz = String.class;

第三种,使用类对象的 getClass() 方法。

String str = new String("Hello");Class clz = str.getClass();

通过反射创建类对象

通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。

第一种:通过 Class 对象的 newInstance() 方法。

Class clz = Apple.class;Apple apple = (Apple)clz.newInstance();

第二种:通过 Constructor 对象的 newInstance() 方法

Class clz = Apple.class;Constructor constructor = clz.getConstructor();Apple apple = (Apple)constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。

Class clz = Apple.class;Constructor constructor = clz.getConstructor(String.class, int.class);Apple apple = (Apple)constructor.newInstance("红富士", 15);

我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。

Class clz = Apple.class;Field[] fields = clz.getFields();for (Field field : fields) {    System.out.println(field.getName());}

而如果使用 Class 对象的 getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性:

Class clz = Apple.class;Field[] fields = clz.getDeclaredFields();for (Field field : fields) {    System.out.println(field.getName());}

与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。

(大白话说Java反射:入门、使用、原理)[]

转载于:https://www.cnblogs.com/Roni-i/p/10908351.html

你可能感兴趣的文章
wcf资料
查看>>
求整数的和与均值
查看>>
http-从域名到页面
查看>>
collection和association的区别于关系
查看>>
数据结构中的算法
查看>>
1021 docker搭建mysql、网络模式、grid
查看>>
CF1082
查看>>
JAVA基础笔记(4) 进制单位与数据类型
查看>>
Dungeon Master (bfs 1A,贴出来纪念一下)
查看>>
typecho流程原理和插件机制浅析(第二弹)
查看>>
jmeter使用第三方代理录制脚本
查看>>
Github Pages 建立过程记录
查看>>
leetcode-127-单词接龙
查看>>
[转]粒子滤波的Matlab仿真算法实现
查看>>
第8章 处理ISDN故障
查看>>
HDU 2112 HDU Today(Dijkstra)
查看>>
android怎么在launcher改动内置apk的icon
查看>>
cocos2dx 利用CCOrbitCamera实现扑克牌翻牌效果
查看>>
开发RESTful WebService
查看>>
【剑指offer】的功率值
查看>>