反射

一、获取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

运行结果如下:

 

posted @   丿狂奔的蜗牛  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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保姆级教程
点击右上角即可分享
微信分享提示