当前位置:网站首页>通过反射执行任意类的任意方法
通过反射执行任意类的任意方法
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方法,输出结果是“汪汪汪…”
边栏推荐
- 趣味 面试题
- Leetcode14 longest public prefix
- How to write a pleasing English mathematical paper
- 2.6 using recursion and stack - [tower of Hanoi problem]
- kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki
- 染色法判定二分图 AcWing 860. 染色法判定二分图
- Fastdateformat why thread safe
- China traffic sign detection data set
- 高性能纠删码编码
- [ybtoj advanced training guide] similar string [string] [simulation]
猜你喜欢
随机推荐
[FFH] little bear driver calling process (take calling LED light driver as an example)
Performance tuning project case
Leetcode209 subarray with the smallest length
MySQL and PostgreSQL methods to grab slow SQL
线性DP AcWing 895. 最长上升子序列
区间DP AcWing 282. 石子合并
Does C language srand need to reseed? Should srand be placed in the loop? Pseudo random function Rand
In development, why do you find someone who is paid more than you but doesn't write any code?
kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki
Map and set
arcgis js 4.x 地图中加入图片
Initial JDBC programming
线性DP AcWing 897. 最长公共子序列
Input a three digit number and output its single digit, ten digit and hundred digit.
Brush questions --- binary tree --2
Rust search server, rust quick service finding tutorial
LeetCode—剑指 Offer 59 - I、59 - II
Input box assembly of the shutter package
FBX import under ue4/ue5 runtime
Less than three months after the programmer was hired, the boss wanted to launch the app within one month. If he was dissatisfied, he was dismissed immediately


![[ybtoj advanced training guidance] cross the river [BFS]](/img/4e/83f14452ea6410768cdd01e725af2e.jpg)





