当前位置:网站首页>通过反射执行任意类的任意方法
通过反射执行任意类的任意方法
2022-07-02 09:43:00 【牧歌ing】
通过反射执行任意类的任意方法
Java的反射机制:在程序运行的时候可以调用
Class aClass = Class.forName(className);
Object obj = aClass.newInstance();等反射的API获取任何类的内部信息(字段、方法等),并且能操作这些内部信息
我们在调用Class.forName(className)的时候,会在堆中加载一个Class类型的对象,这个对象就是传入的className,也就是说我们可以通过这个Class类型的对象操作className的方法、属性等。
1、项目结构

2、用来演示的两个类
package com.zhou.reflect.pet;
/** * @author DELL * @version 1.0 * @Description * @date 2022/5/24 16:58 */
public class Cat {
public void sound(){
System.out.println("喵喵喵...");
}
}
package com.zhou.reflect.pet;
/** * @author DELL * @version 1.0 * @Description * @date 2022/5/24 16:54 */
public class Dog {
public void sound(){
System.out.println("汪汪汪...");
}
}
3、properties
# 这里配置需要调用的类路径
className=com.zhou.reflect.pet.Cat
# 需要调用的方法
methodName=sound
4、主要实现
package com.zhou.reflect;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.lang.reflect.Method;
import java.util.Properties;
/** * @author DELL * @version 1.0 * @Description * @date 2022/5/24 17:05 */
public class ReflectFactory {
public static void main(String[] args) {
/* * 需求:不修改这个类的代码,自动调用任意类的任意方法 * */
try {
//1、得到resource目录下的properties
ClassPathResource classPathResource = new ClassPathResource("/application.properties");
Properties properties = PropertiesLoaderUtils.loadProperties(classPathResource);
//2、获取配置文件的内容
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//3、得到类的对象
Class aClass = Class.forName(className);
//4、初始化这个对象
Object obj = aClass.newInstance();
//5、得到类的方法
Method method = aClass.getMethod(methodName);
//6、执行这个方法
method.invoke(obj);
} catch (Exception ex) {
System.out.println(ex);
}
}
}
5、执行结果
配置文件中配置的调用Cat的sound方法,输出结果是“喵喵喵…”
配置文件中配置的调用dog的sound方法,输出结果是“汪汪汪…”
边栏推荐
- Jenkins voucher management
- Drools terminates the execution of other rules after executing one rule
- 1380. Lucky numbers in the matrix [two-dimensional array, matrix]
- 线性DP AcWing 898. 数字三角形
- Shutter encapsulated button
- CV2 in OpenCV VideoWriter_ Fourcc() function and cv2 Combined use of videowriter() function
- Go learning notes - go based interprocess communication
- 中国交通标志检测数据集
- Differences between nodes and sharding in ES cluster
- kubenetes中port、targetPort、nodePort、containerPort的区别与联系
猜你喜欢

Is the neural network (pinn) with embedded physical knowledge a pit?

寻找二叉树中任意两个数的公共祖先

Does C language srand need to reseed? Should srand be placed in the loop? Pseudo random function Rand

Floyd AcWing 854. Floyd求最短路

Deep Copy Event bus

BOM DOM

mysql数据库基础

PR 2021 quick start tutorial, learn about the and functions of the timeline panel

SparkContext: Error initializing SparkContext解决方法

(C language) input a line of characters and count the number of English letters, spaces, numbers and other characters.
随机推荐
防抖 节流
排序---
Sparkcontext: error initializing sparkcontext solution
China traffic sign detection data set
Tas (file d'attente prioritaire)
LeetCode—<动态规划专项>剑指 Offer 19、49、60
分布式机器学习框架与高维实时推荐系统
arcgis js 4.x 地图中加入图片
Brush questions --- binary tree --2
AI mid stage technology research
线性DP AcWing 899. 编辑距离
Docker-compose配置Mysql,Redis,MongoDB
Fastdateformat why thread safe
Performance tuning project case
Sort---
Drools executes string rules or executes a rule file
CDA数据分析——AARRR增长模型的介绍、使用
Find the common ancestor of any two numbers in a binary tree
线性DP AcWing 902. 最短编辑距离
使用Sqoop把ADS层数据导出到MySQL