zoukankan      html  css  js  c++  java
  • Java反射拾遗

    定义:Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。
    反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值。

    反射作用:使用Java反射机制可以在运行时期检查Java类的信息,检查Java类的信息往往是你在使用Java反射机制的时候所做的第一件事情,
    通过获取类的信息你可以获取以下相关的内容

      Class对象
      类名
      修饰符
      包信息
      父类
      实现的接口
      构造器
      方法
      变量
      注解

    Class对象:
    反射获取class对象两种方式
    Class.forName("类名全称");
    forName是Class对象的静态方法,会装入类,并做类的静态初始化,返回Class的对象。

    名.class;
    JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象。

    具体的参考如下代码:

    Class<?> bean = Class.forName("com.*.common.ReflectBean");
            ReflectBean reflectBean = (ReflectBean) bean.newInstance();
            System.out.println("实例1" + reflectBean);
            Class<?> bean1 = ReflectBean.class;
            ReflectBean reflectBean1 = (ReflectBean) bean1.newInstance();
            System.out.println("实例2" + reflectBean1);
            int modifiers = bean.getModifiers();
            System.out.println("类的修饰符" + modifiers);
            System.out.println("类的修饰符是否为public" + Modifier.isPublic(modifiers));
            System.out.println("类的全名" + bean.getName());
            System.out.println("类的简名" + bean.getSimpleName());
            Package packageInfo = bean.getPackage();
            System.out.println("类的包信息" + packageInfo);
            Class superClass = bean.getSuperclass();
            System.out.println("类的父类" + superClass.getName());
            for (Class interFace : bean.getInterfaces()) {
                System.out.println("类的接口" + interFace.getName());
            }
    
            for (Constructor interFace : bean.getConstructors()) {
                System.out.println("类的构造方法" + interFace.getName());
            }
    
            for (Method interFace : bean.getMethods()) {
                System.out.println("类的方法" + interFace.getName());
            }
    
            for (Field interFace : bean.getFields()) {
                System.out.println("类的公共变量" + interFace.getName());
            }
    
    
            for (Annotation annotation : bean.getAnnotations()) {
                // 此处没注解是因为 setter getter 等都是编译时期的 这拿到的是运行期的
                System.out.println("类的注解" + annotation.toString());
            }
    @Getter
    @Setter
    @ToString(callSuper = true)
    @Lazy
    public class ReflectBean extends ReflectBeanSuper implements ReflectInterface {
        public String name;
    
        public ReflectBean () {
    
        }
    
        public ReflectBean (String name) {
            this.name = name;
        }
        @Override
        public String getReflectName() {
            return name;
        }
    }
    @Getter
    @Setter
    @ToString
    public class ReflectBeanSuper {
        private String sex;
    }
    public interface ReflectInterface {
        String getReflectName();
    }

    运行结果如图:

    这里写的比较简单,都在代码里体现了,如果需要具体的操作可以在参考相关API

  • 相关阅读:
    CADisplayLink
    对项目重命名
    TCP|UDP|Http|Socket
    CoreAnimation|动画
    Autolayout
    通讯录
    本地通知
    用于做 Android 屏幕自适应的文章资源
    Java String.format 自动补全不够的位数
    不同语言之间 日期格式转换
  • 原文地址:https://www.cnblogs.com/daily-note/p/8431842.html
Copyright © 2011-2022 走看看