简单明了的java反射demo

这是一个小例子关于如何使用在java中调用反射

通过反射获取一个类的构造方法

public interface Demo {
    public static void main(String[] args) throws Exception{
        /*
            通过反射获取一个类的构造方法:
                1.Constructor是构造方法类,任何一个类中的构造方法都可以封装成员一个Constructor的对象
                  所以可以使用Constructor类的对象调用封装的构造方法来创建类的对象
                2.怎么获取一个类的构造方法对应的Constructor对象
                    Class类中的方法:
                        - 批量获取构造方法对象:
                          - public Constructor[] getConstructors():获取所有公有构造方法。
                          - public Constructor[] getDeclaredConstructors():获取所有的构造方法,包括:公有、受保护、默认、私有。

                        - 获取单个:
                          - public Constructor getConstructor(Class… params):获取某个公有构造方法。
                                                             Class类型的参数: 传入构造方法参数类型的字节码对象
                          - public Constructor getDeclaredConstructor(Class … params):*获取某个构造方法,可以是“公有,受保护、默认、私有”
                                                             Class类型的参数: 传入构造方法参数类型的字节码对象
                3.通过Constructor对象调用构造方法创建对象:
                    Constructor类中的方法:
                        newInstance(Object… params):表示执行该Constructor对象表示的构造方法
                                    参数params:传入执行构造方法需要的实参
                        setAccessible(true): 暴力反射,允许反射
         */
        // 获取User类的字节码对象
        Class clazz = User.class;

        // 获取所有公共的构造方法:
        Constructor[] consArr1 = clazz.getConstructors();
        System.out.println(consArr1.length);// 2

        // 获取所有的构造方法:
        Constructor[] consArr2 = clazz.getDeclaredConstructors();
        System.out.println(consArr2.length);// 4

        // 获取单个公共的构造方法:
        Constructor constructor1 = clazz.getConstructor();
        Constructor constructor2 = clazz.getConstructor(String.class, int.class);

        // 获取单个私有的构造方法:
        Constructor constructor3 = clazz.getDeclaredConstructor(int.class);
        Constructor constructor4 = clazz.getDeclaredConstructor(String.class);

        // 使用constructor1调用newInstance方法
        User user1 = (User) constructor1.newInstance();

        // 使用constructor2调用newInstance方法
        User user2 = (User)constructor2.newInstance("张三",1);
        System.out.println(user2.name+"..."+user2.id);

        // 使用constructor3调用newInstance方法
        constructor3.setAccessible(true);// 暴力反射
        User user3 = (User) constructor3.newInstance(2);
        System.out.println(user3.id);// 2

    }
}

通过反射获取一个类的属性

public interface Demo {
    public static void main(String[] args) throws Exception{
        /*
            通过反射获取一个类的构造方法:
                1.Constructor是构造方法类,任何一个类中的构造方法都可以封装成员一个Constructor的对象
                  所以可以使用Constructor类的对象调用封装的构造方法来创建类的对象
                2.怎么获取一个类的构造方法对应的Constructor对象
                    Class类中的方法:
                        - 批量获取构造方法对象:
                          - public Constructor[] getConstructors():获取所有公有构造方法。
                          - public Constructor[] getDeclaredConstructors():获取所有的构造方法,包括:公有、受保护、默认、私有。

                        - 获取单个:
                          - public Constructor getConstructor(Class… params):获取某个公有构造方法。
                                                             Class类型的参数: 传入构造方法参数类型的字节码对象
                          - public Constructor getDeclaredConstructor(Class … params):*获取某个构造方法,可以是“公有,受保护、默认、私有”
                                                             Class类型的参数: 传入构造方法参数类型的字节码对象
                3.通过Constructor对象调用构造方法创建对象:
                    Constructor类中的方法:
                        newInstance(Object… params):表示执行该Constructor对象表示的构造方法
                                    参数params:传入执行构造方法需要的实参
                        setAccessible(true): 暴力反射,允许反射
         */
        // 获取User类的字节码对象
        Class clazz = User.class;

        // 获取所有公共的构造方法:
        Constructor[] consArr1 = clazz.getConstructors();
        System.out.println(consArr1.length);// 2

        // 获取所有的构造方法:
        Constructor[] consArr2 = clazz.getDeclaredConstructors();
        System.out.println(consArr2.length);// 4

        // 获取单个公共的构造方法:
        Constructor constructor1 = clazz.getConstructor();
        Constructor constructor2 = clazz.getConstructor(String.class, int.class);

        // 获取单个私有的构造方法:
        Constructor constructor3 = clazz.getDeclaredConstructor(int.class);
        Constructor constructor4 = clazz.getDeclaredConstructor(String.class);

        // 使用constructor1调用newInstance方法
        User user1 = (User) constructor1.newInstance();

        // 使用constructor2调用newInstance方法
        User user2 = (User)constructor2.newInstance("张三",1);
        System.out.println(user2.name+"..."+user2.id);

        // 使用constructor3调用newInstance方法
        constructor3.setAccessible(true);// 暴力反射
        User user3 = (User) constructor3.newInstance(2);
        System.out.println(user3.id);// 2

    }
}

通过反射获取一个类的方法

public class Demo {
    public static void main(String[] args) throws Exception{
        /*
            通过反射获取一个类的方法:
                1.Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。
                2.如何通过反射获取一个类的方法
                    Class类中的方法:
                        1. Method[] getMethods() 获取所有的public修饰的成员方法,包括父类中
                        2. Method[] getDeclaredMethods() 获取当前类中所有的方法,包含私有的,不包括父类中

                        3. Method getMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
                        4. Method getDeclaredMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,包括private修饰的
                3.通过Method对象调用对应的方法:
                    Method类中的方法:
                        1. Object invoke(Object obj, Object... args)
                            参数1obj:调用成员方法的对象
                            参数2args:表示调用方法所需要的实参
                            如果obj=null,则表示该方法是静态方法

                       2. void setAccessible(true)
                            暴力反射,设置为可以直接调用私有修饰的成员方法
         */
        // 获取Zi类的Class对象
        Class clazz = Zi.class;

        // 如何通过反射获取一个类的方法:
        // 获取多个方法:
        // 1.获取所有的public修饰的成员方法,包括父类中
        Method[] methodsArr1 = clazz.getMethods();
        System.out.println(methodsArr1.length);// 12 因为Object类中有9个public修饰的方法
        System.out.println(Fu.class.getMethods().length);// 10 Fu类:1个  Object类:9个

        // 2.获取当前类中所有的方法,包含私有的,不包括父类中
        Method[] methodsArr2 = clazz.getDeclaredMethods();
        System.out.println(methodsArr2.length);// 3

        // 获取单个方法
        // 1.根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
        // 获取test1方法的对象
        Method method1 = clazz.getMethod("test1");
        System.out.println(method1);

        // 获取test2方法的对象
        Method method2 = clazz.getMethod("test2", int.class);
        System.out.println(method2);

        // 2.根据方法名和参数类型获得一个方法对象,包括private修饰的
        // 获取test3方法的对象
        Method method3 = clazz.getDeclaredMethod("test3");
        System.out.println(method3);

        System.out.println("=============================");
        // 通过Method对象调用对应的方法:  非静态方法
        // 调用method1对象表示的test1方法:
        Zi zi = new Zi();
        method1.invoke(zi);

        // 调用method2对象表示的test2方法:
        Zi zi2 = new Zi();
        method2.invoke(zi2,100);

        // 调用method3对象表示的test3方法:
        method3.setAccessible(true);
        Zi zi3 = new Zi();
        method3.invoke(zi3);

        System.out.println("=============================");
        //  通过Method对象调用对应的方法: 静态方法
        Method method4 = clazz.getDeclaredMethod("test4", String.class);
        Method method5 = clazz.getDeclaredMethod("test5", String.class);
        System.out.println(method4);
        System.out.println(method5);

        // 调用method4对象表示的test4方法:
        method4.invoke(null,"test4方法执行了...");

        // 调用method5对象表示的test5方法:
        method5.setAccessible(true);
        method5.invoke(null,"test5方法执行了...");

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值