反射的基本用法

本文通过一个Dog类展示了Java中的反射机制,包括通过对象、类名和forName方法获取Class对象,以及获取类的属性、方法、构造器的方式。同时对比了getMethods()和getDeclaredMethods()在获取方法上的区别,以及getFields()和getDeclaredFields()在获取属性上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//首先我们先创建一个实体类


public class Dog {

    private int did;
     int age;
    public String dname;


    private void eat(){
        System.out.println("私有的吃方法");
    }

    void sleep(){
        System.out.println("小狗睡觉");
    }

    public void jiao(){
        System.out.println("小狗要叫");
    }

}

/*
定义一个Test类,通过反射进行实例化、获取属性、函数等等

*/

public class Test {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Dog dog = new Dog();
//        dog.jiao();

        //我们直接可以通过 对象名 或者类名
        //在运行阶段获取嵌class对象(原生所在类)


        //第一种:通过已有对象  来方向获取
        Class clazz = dog.getClass();       //class pojo.Dog
        String name = clazz.getName();      //pojo.Dog

        //第二种
        Class clazz1=Dog.class;

        //第三种  通过forName
        Class clazz2 = Class.forName("pojo.Dog");

        Object ob = clazz.newInstance();        // 使用反射来创建对象   注意:如果 Class<> 没有指定类型 则使用Object来进行接收


        //上述三种  哪一个相当于更好一点
        //第三种更能体现反射的本质 因为
        //第一种 还需要提前创建对象 有点奇怪
        //第二种  需要提前导包 如果不引入包 则报错 (两个类之间不可避免的会产生耦合)
        //第三种 是不需要跟其他包提前创建建立联系的 我只需要通过字符串去反射即可

        clazz.getPackage().getName();   //获取到包名  pojo
        clazz.getSimpleName();          //获取到类名  Dog
        clazz.getName();                //获取到完整的路径  pojo.Dog


//1,获取函数的两种方式
        //获取方法 获取此类中的Object和公共的方法
        Method[] methods = clazz.getMethods();//获取该类中所有的方法包括继承得来的方法
        for (Method m:methods
             )
            System.out.println(m.getName()); {      //获取方法名

        }

        System.out.println("===========================");

        //只获取本类中声明的函数,不包括默认继承的Object 包括私有 被保护的
        Method[] methods1 = clazz.getDeclaredMethods();
        for (Method m:methods1
        )
            System.out.println(m.getName()); {      //获取方法名

        }

        System.out.println("-----------------------");
//2. 获取属性的


        Field[] fields = clazz.getFields();                //能获取所有公开的成员变量。包括继承而来的
        Field[] declaredFields = clazz.getDeclaredFields();//获取自己声明的属性,不获取所继承的成员变量
        //自行输出测试


        for (Field m:fields
        )
            System.out.println(m.getName()+","+m.getType()); {      //获取属性  dname,class java.lang.String  获取到类型

        }

        System.out.println("--=-=-==-==-==-=-=-=-=-");

        for (Field m:declaredFields
        )
            System.out.println(m.getName()); {      //获取自己所定义的成员变量 局部变量拿不到 不拿所继承的

        }


//3. 获取构造方法

        Constructor[] constructors = clazz.getConstructors();   //获取所有能访问到的 包括继承父类的
        Constructor[] clazzDeclaredConstructors = clazz.getDeclaredConstructors();  //获取现有自己所定义的构造方法


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值