java反射浅析

反射


1.什么是反射

引用:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 


2.获取Class类对象的方式

  • 在此我们以Person类为操作类进行说明
    public class Person {
    private int id;
    public String name;
    protected String addr;
    double price;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Person(int id, String name, String addr, double price) {
        super();
        this.id = id;
        this.name = name;
        this.addr = addr;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}
  • 方法一:已知Person类
Class clazz = Person.class;
  • 方法二:已知Person的类对象
Person person = new Person();
Class clazz1 = person.getClass();
  • 方法三:已知Person类的包名+类名
Class clazz = Class.forName("str");//str为Person类的包名+类名
Class clazz = Integer.TYPE;

同一个类的Class类对象模板只有一个,所以以上所有的clazz对象都是引用的同一个内存地址.


3.通过反射如何获取Person类中的属性并赋值

  • 通过反射获取Person类的属性
Class<Person> clazz = Person.class;
//获取属性对象集合
Field[] fields = clazz.getDeclaredFields();
//遍历属性对象集合
for(Field f : fields){
    //获取访问修饰符
    int modifiers = f.getModifiers();
    //获取数据类型
    String type = f.getType().getSimpleName();
    //获取字段名
    String name = f.getName();
    System.out.println(modifiers+" "+ type+" "+name+";");
}
  • 通过反射为属性赋值
Class<Person> clazz = Person.class;
//通过指定属性名获取属性字段
Field field = clazz.getDeclaredField("id");
//忽略访问修饰符,这样就可以private,protected修饰的字段赋值
field.setAccessible(true);
//实例化一个person对象
Person person = clazz.newInstance();
//为属性赋值
field.setInt(person, 20);
System.out.println(person.getId());

4.通过反射如何获取Person类的构造方法

Class<Person> clazz = Person.class;
//获取Person类中的构造方法的数组
Constructor<?>[] constructor = clazz.getDeclaredConstructors();
//遍历数组
for(Constructor c : constructor){
    //获取构造方法访问修饰符
    int modifiers = c.getModifiers();
    //获取构造方法名
    String nameString = c.getName();
    //获取构造方法参数列表
    Class[] parameters = c.getParameterTypes();
    for(Class p : parameters){
        //获取参数列表类型的简单名:即没有包名的数据类型
        String para = p.getSimpleName();
        System.out.println(modifiers+" "+nameString+" ("+para+")"+"{}");
    }
}

上面所述只是对反射的一些浅显的介绍,反射常用于各种Java框架之中,用于简化开发人员的开发过程。反射中的方法还是挺多的,参阅Java帮助文档可以帮助我们更好的学习和理解Java反射的应用。
欢迎小伙伴们指正和交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值