[Java基础]反射

反射#

获取任意对象的数据

对对象一无所知的情况下

public class Student {
    
    private String name;
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws IllegalAccessException {
        
        Student student = new Student("段昌峰", 25);

        // 在未知对象情况的条件下,读出对象的所有数据
        // 获取class类对象,这个对象中存储了关于student对象的所有信息
        Class<? extends Student> aClass = student.getClass();
        // 获取class对象中的所有成员变量
        Field[] fields = aClass.getDeclaredFields();
        // 遍历成员变量,首先把成员变量的可访问性改为true
        // 然后,通过getname和get方法获取成员变量的名称和值
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.getName()+"="+field.get(student));
        }
    }
}

通过配置文件,创建对象并且调用方法

首先编写配置文件

className=Teacher
methodName=teach

其次编写bean类

public class Teacher {
    public Teacher() {
    }

    public void teach(){
        System.out.println("老师正在教学");
    }
}

最后编写main函数中的方法

//读取配置文件
Properties p = new Properties();
FileInputStream fi = new FileInputStream("./pros.properties");
p.load(fi);
String className = (String) p.get("className");
String methodName = (String) p.get("methodName");

//首先根据全类名获得class对象
Class<?> aClass = Class.forName(className);
//获得构造方法
//并使用构造方法newinstance生成对象
Constructor<?> constructor = aClass.getDeclaredConstructor();
Object o = constructor.newInstance();
//获得对象的对应方法
Method declaredMethod = aClass.getDeclaredMethod(methodName);
//通过invoke执行对应的方法
//invoke方法的参数列表分别是调用这个方法的对象和传入的参数
declaredMethod.invoke(o);

以上代码可以实现根据配置文件中的两个字符串,我们就可以生成这个对象,并且执行对象中的某个方法,以后我们就可以通过简单的更改配置文件来生成另一个对象,执行另一个方法。

作者:Esofar

出处:https://www.cnblogs.com/DCFV/p/18292609

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Duancf  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示