Java 反射调用方法实例,动态动用方法实例
2023-09-11 14:14:47 时间
包结构
Hello.java
package test;
public class Hello {
public double add (double score1, double score2){
return score1 + score2;
}
public void print(){
System.out.println("OK");
}
public static double mul(double score1, double score2){
return score1 * score2;
}
}
CalculatorTest.java
package test;
import java.lang.reflect.Method;
class Calculator{
public Calculator(){
//这个构造器仅有一个参数:name
System.out.println("Calculator 构造函数");
}
public String eDIo(String str){
String str_temp = "";
str_temp = str.replace("World", "Hello");
return str_temp;
}
}
public class CalculatorTest {
public static void main(String[] args) throws Exception {
Calculator cal = new Calculator();
String str_class_name = cal.eDIo("test.World");
//方法一:通过类的.class属性获取
//Class<Hello> clz = Hello.class;
//方法二:通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException
Class clz = Class.forName(str_class_name);
//方法三:new一个实例,然后通过实例的getClass()方法获取
//Hello s = new Hello();
//Class<Hello> clz = s.getClass();
//1. 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组
Method method = clz.getMethod("mul", new Class[]{double.class, double.class});
//invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数
Object result = method.invoke(null, new Object[]{2.0, 2.5});
//如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性
//method.setAccessible(true);//私有的方法通过发射可以修改其访问权限
System.out.println(result);//结果为5.0
//2. 获取类中的非静态方法
Method method_2 = clz.getMethod("add", new Class[]{double.class, double.class});
//这是实例方法必须在一个对象上执行
Object result_2 = method_2.invoke(new Hello(), new Object[]{2.0, 2.5});
System.out.println(result_2);//4.5
//3. 获取没有方法签名的方法print
Method method_3 = clz.getMethod("print", new Class[]{});
Object result_3 = method_3.invoke(new Hello(), null);//result_3为null,该方法不返回结果
}
}
运行结果
Calculator 构造函数
5.0
4.5
OK
相关文章
- Java IO--字节流与字符流OutputStream/InputStream/Writer/Reader
- 实例解析java + jQuery + json工作过程(获取JSON数据)
- java面向对象高级分层实例_测试类(main方法所在的类)
- Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵
- Java实现 LeetCode 590 N叉树的后序遍历(遍历树,迭代法)
- Java实现 LeetCode 39 组合总和
- Java实现 洛谷 P1035 级数求和
- java实现第三届蓝桥杯古代赌局
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java通过继承外部类来建立该外部类的protected内部类的实例(转)
- Java中List与Map初始化的一些写法
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- 【JAVA】java编译错误:编码UTF8/GBK的不可映射字符
- [Linux] Install java and add JAVA_HOME, PATH
- 【Java】MyBatis与Spring框架整合(二)
- java 发送邮件实例
- java 11 标准Java异步HTTP客户端
- 【Java】java使用反射访问对象方法和成员变量
- Atiitt 对象转换json 序列化规范 Java 循环引用的解决 设置序列化层次深度 去除不必的属性 太长不方便月度 jsonObject.remove("num1"); Prety fo
- 华为OD机试 - 金字塔(Java & JS & Python)
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
- 解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题
- java枚举通俗实例解析
- Java中字符串的几个实例
- JAVA运行java程序
- JAVA语言之Java 中不同的并行实现的性能比较
- Java开发入门到精通之Java中重写和重载的区别
- java 静态方法和实例方法的区别
- java面试题:Linux
- 【java】Java 封装
- Java刷题面试系列习题(十三)