反射
一、获取Class对象的三种方式:
方式一: 通过Object类中的getObject()方法
Person p = new Person(); Class c = p.getClass();
方式二:通过 类名.class
Class c2 = Person.class;
方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可);
Class c3 = Class.forName("Person");
l 注意:第三种和前两种的区别
前两种你必须明确Person类型.
后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了;
下面为啥添加123 时候会报错 原因:在于有了泛型约束 要想把int类型存进去 需要泛型擦除
public class Demo01 { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { List<String> arr=new ArrayList<String>(); arr.add("abc"); arr.add(123);//泛型约束所以报错 //这时候就用到泛型擦除 //获取Arraylist 的class对象 Class c=arr.getClass(); //获取add方法对象 Method m=c.getMethod("add", Object.class); //执行方法 m.invoke(arr, 123); for(Object o:arr){ System.out.println(o); } } }
配置反射文件(重点):
分别创建3个构造方法:
public class Student { public void study(){ System.out.println("学生学习"); } } public class Work { public void work() { System.out.println("工人工作"); } } public class Cooker { public void cook(){ System.out.println("厨师炒菜"); } }
配置文件:
className=com.oracle.demo02.Student methodName=study #className=com.oracle.demo02.Worker #methodName=work #className=com.oracle.demo02.Cooker #methodName=cook
public class Demo02 { public static void main(String[] args) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, NoSuchMethodException, SecurityException, ClassNotFoundException { //创建properties集合 Properties pro=new Properties(); //明确数据源 FileInputStream fis=new FileInputStream("src/com/oracle/demo02/config.properties"); //将Properties文件中的数据读取到Properties中 pro.load(fis); //获取完成包名+类名 String className=pro.getProperty("className"); //获取方法名 String methodName=pro.getProperty("methodName"); //获取class字节码文件对象 Class c=Class.forName(className); //获取方法对象 Method m=c.getMethod(methodName); //快速创建对象 Object obj = c.newInstance(); //执行方法 m.invoke(obj); } }
这样想调用哪个时候只改动配置文件就可以了;
配置文件修改后:
#className=com.oracle.demo02.Student #methodName=study #className=com.oracle.demo02.Worker #methodName=work className=com.oracle.demo02.Cooker methodName=cook
运行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程