Java反射机制

来源:互联网 发布:360检测网络异常 编辑:程序博客网 时间:2024/05/20 17:40

Java反射机制
反射我又给忘了 学了长时间不用就要忘 干脆写个提醒自己开发的博客

反射第一步:
三种方式获取类类型Clazz

//假设有一个User对象//1.通过对象 User u = new User();Class<?> clazz = u.getClass()//2.通过类Class<?> clazz = User.class//3.通过Class类Class<?> clazz = Class.forName(包名.类名)

拿到了clazz 其实无非就想获取类中的东西 包括:
1.构造器 2.属性字段 3.方法 4.类上的 或 属性上的 或 方法上的 注解
5.包…等等等等

前四个用的最多 直接上代码得了

属性 获取属性 对属性赋值

  获取Class有三种方式        //1.对象.getClass() 2..class  3.Class.forName        ChannelBindDay c = new ChannelBindDay();        Class<?> clazz1 = c.getClass();        System.out.println(clazz1);        Class<?> clazz2 = ChannelBindDay.class;        System.out.println(clazz2);        Class<?> clazz3 = Class.forName("model.ChannelBindDay");        System.out.println(clazz3);        //getFields 只能获取 父子类 public的属性//        Field[] fields = clazz3.getFields();//        System.out.println(fields.length);//        for (Field field : fields) {//            System.out.println(field.getName());//        }        // 获取Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段//        Field[] declaredFields = clazz3.getDeclaredFields();//        for (Field declaredField : declaredFields) {//            System.out.println(declaredField.getName());//        }        //属性赋值        Field name = clazz3.getDeclaredField("dimLevel");        //对私有的进行访问许可        name.setAccessible(true);        ChannelBindDay o = (ChannelBindDay)clazz2.newInstance();        name.set(o,"何睿");//        System.out.println(o.getDimLevel());

构造器 获取构造器 用构造器创建对象

 Class<?> clazz = Class.forName("model.ChannelBindDay");        //获取public构造方法//        Constructor<?>[] constructors = clazz.getConstructors();//        for (Constructor<?> constructor : constructors) {//            System.out.println(constructor.getName());//        }        //获取public构造方法//        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();//        for (Constructor<?> declaredConstructor : declaredConstructors) {//            System.out.println(declaredConstructor.getName());//        }        //获取public参数为空的构造方法//        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();//        System.out.println(declaredConstructor.getName());        //获取public 参数为String构造方法//        Constructor<?> declaredConstructor1 = clazz.getDeclaredConstructor(String.class);//        System.out.println(declaredConstructor1.getName());        //创建对象        Constructor<?> constructor = clazz.getConstructor();        Object o = constructor.newInstance();        //创建对象 用另一个构造        Constructor<?> constructor1 = clazz.getDeclaredConstructor(String.class);        constructor1.setAccessible(true);        ChannelBindDay c   = (ChannelBindDay)constructor1.newInstance("heh");    }

方法 获取方法 调用方法

  Class<?> clazz = Class.forName("model.ChannelBindDay");        Object o = clazz.newInstance();        //获取所有public的方法 包含父类的 Object的        clazz.getMethods();        //获取当前类的方法 包含private        Method[] methods = clazz.getDeclaredMethods();        for (Method method : methods) {            System.out.println(method.getName());        }        //获取无参数的say方法        Method m1 = clazz.getMethod("say");        m1.invoke(o);        //获取有参数的dos方法        Method m2 = clazz.getMethod("dos", String.class);        m2.invoke(o,"呵呵");        Method say1 = clazz.getDeclaredMethod("say1");        say1.setAccessible(true);        say1.invoke(o);

注解 获取注解 获取注解中的值
注意这个 X.isAnnotationPresent(注解.class) 判断当前Obj上有没有这个注解 很有用

  Class<?> clazz = Class.forName("model.ChannelBindDay");        //获取类上的注解        Annotation[] annotations = clazz.getAnnotations();        for (Annotation annotation : annotations) {            System.out.println(annotation);        }        Field field = clazz.getDeclaredField("dimLevel");        Annotation[] annotations1 = field.getAnnotations();        for (Annotation annotation : annotations1) {            //该字段上是否有某注解            if(field.isAnnotationPresent(Ano.class)){                System.out.println(1);                Ano a = field.getAnnotation(Ano.class);                System.out.println(a.value());            }        }    }

详细博客参考 https://www.cnblogs.com/jalja/p/6084445.html 讲的很好

原创粉丝点击