反射入门

什么是反射?

反射是一种在运行时解析类的技术。

public class Reflex {
    public static void main(String[] args) throws Exception {
        //1、必须获得操作类所对应的Class对象-一个类只对应唯一的一个class对象
        //类名.class
        //对象.getClass()
        //Class.forName("类的全路径限定名")
        Class c1 = Cat.class;
        Class c2 = new Cat().getClass(); //Cat是内部类需要是静态的,因为静态随着类的加载而加载,非静态需要Reflex对象创建Cat对象
        Class c3 = new Cat().getClass();
        //Class c4 = Class.forName("com.springbootaop.controller.Cat");
        //System.out.println(c1 == c2);//true
        //System.out.println(c1 == c4);//true
        //System.out.println(c3 == c2);//true
        Cat o = (Cat) c1.newInstance();//调用默认的无参构造
        Constructor constructor = c1.getConstructor();//获取无参构造方法
        //Constructor constructor2 = c1.getConstructor(String.class);//获取带String参数的构造方法
        Constructor constructor3 = c1.getConstructor(String.class, int.class);//获取带String参数&int 参数的构造方法
        //通过构造方法创建对象
        Cat cat = (Cat) constructor.newInstance();
        //constructor2.newInstance("");
        constructor3.newInstance("", 1);
        Constructor[] constructors = c1.getConstructors();//获取所有的公共的构造方法
        Constructor declaredConstructor = c1.getDeclaredConstructor();//获取指定的私有构造方法
        Constructor[] declaredConstructors = c1.getDeclaredConstructors();//获取所有构造方法(包含私有)

        //3、通过class对象获得类本身的修饰符
        int modifiers = c1.getModifiers();//获得当前Person类的所有修饰符System.out.println(modifiers);
        System.out.println("是不是公有的- " + Modifier.isPublic(modifiers));
        System.out.println("是不是私有的- " + Modifier.isPrivate(modifiers));
        System.out.println("是不是静态的- " + Modifier.isStatic(modifiers));
        System.out.println("是不是最终的-" + Modifier.isFinal(modifiers));
        System.out.println("是不是接口-" + Modifier.isInterface(modifiers));

        //4、通过class对象获得类的属性
        // Field field = c1.getField("name ");//获得公有的指定的属性值
        //Field[] fields = c1.getFields();//获得公有的所有属性
        Field nField = c1.getDeclaredField("name");
        nField.setAccessible(true);//操作私有成员需要授权
        //Field[] nFields = c1.getDeclaredFields();//获得所有公有以及私有属性值
        nField.set(cat, "小舞");//给对象设置值
        String catName = (String) nField.get(cat);//获取某个对象的属性值
        int modifiers1 = nField.getModifiers();//获取属性修饰符
        //nField.getAnnotation()获取指定注解

        Method method = c1.getMethod("sleep", int.class);
        Object invoke = method.invoke(cat, 1);//运行某对象的sleep方法,并获取返回值
//        method.getModifiers();
//        method.getAnnotation();
//        method.getReturnType();
        Class<?>[] parameterTypes = method.getParameterTypes();//获得形式参数类型的class对象
        for (Class<?> parameterType : parameterTypes) {
            System.out.println("参数类型:" + parameterType.getName()); //参数类型:int
        }
        Parameter[] parameters = method.getParameters();//获得形式参数的反射对象
        for (Parameter parameter : parameters) {
            String name = parameter.getName();
            System.out.println("参数名称:" + name);//参数名称:age
            //也可以获取参数的parameter.getModifiers 注解等等
        }
    }

    public static class Cat {
        private String name;
        private String sex;
        private int age;

        public Cat(String name, int age) {
            this.name = name;
            this.age = age;
        }

        private Cat(String name) {
            this.name = name;
        }

        public Cat() {
        }

        public void sleep(int age) {
            System.out.println(name + "在睡觉-->" + age);
        }

        public void run() {
            System.out.println(name + "在跑步");
        }

        @Override
        public String toString() {
            return "Cat{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值