JAVA反射

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

说白了就是,有一个程序已经在运行了,但是运行中间你想知道某一个类的详细信息。
第一反应,那我(人)直接在Project的文件里找到对应的类点开看看这个类的定义(.java文件)不就完事了。我这样也算是动态获取了信息。
就java而言肯定不可能这么做,那么java是如何动态获取的呢?就是反射机制了。

我们在idea里写的都是.java文件,但是经过编译.java文件就变成了.class文件,然后程序运行前这些.class文件会经历一个类加载过程(类加载->类的连接(验证->准备->解析)->类的初始化)然后就会被使用了。

在类加载这个阶段,在内存中会生成一个代表这个类的java.lang.Class对象,这个对象就是反射机制的关键。

我(人) idea .java文件
Java程序 内存 Class对象

public class Person{
    //属性
    private String name;
    private String age;
    private String sex;
    public String country;

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }


    //构造器
    public Person(String name, String age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //方法
    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    protected void eat(String food){
        System.out.println("吃饭:"+food);
    }
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Main {
    public static void main(String[] args) {
        Person person = new Person("小明", "18", "男");
        Class clazz = person.getClass();
        System.out.println(clazz.getSimpleName());
        //获取所有属性
        System.out.println("==获取所有属性==");
        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f.getName() + ":" + f.getType().getName());
        }

        //获取public属性
        System.out.println("==获取public属性==");
        Field[] fieldsNotPrivate = clazz.getFields();
        for (Field f : fieldsNotPrivate) {
            System.out.println(f.getName() + ":" + f.getType().getName());
        }

        //获取所有public方法
        System.out.println("==获取所有public方法==");
        Method[] methods=clazz.getMethods();
        for (Method i : methods) {
            System.out.println(i.getName() + ":" + i.getReturnType().getName());
        }
        //获取所有方法
        System.out.println("==获取所有方法==");
        Method[] methods1=clazz.getDeclaredMethods();
        for (Method i : methods1) {
            System.out.println(i.getName() + ":" + i.getReturnType().getName());
            //获取参数
            {
                Parameter[] parameters = i.getParameters();
                for (Parameter p : parameters) {
                    System.out.println(p.getName() + ":" + p.getType().getName());
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值