• Java反射有多强? 他拥有这五大神奇功能![转自CSDN郑为中]


    什么是反射?

        Java中,对于任意一个运行中的对象,可以调用该对象的任意属性和方法;已知一个类,可以获取这个类的所有属性和方法,这就是反射机制。

        一般情况下,根据面向对象封装原则,Java实体类的属性都是私有的,我们不能获取类中的属性。但我们可以根据反射,获取私有变量、方法、构造器,甚至是注解。

    如何使用?

        在最近的项目开发中,有一个需求:将人员档案的80+个字段,设置部分为隐私字段,比如有权限可以看,权限需要动态分配。

        我们不可能写80if - else,那么我就使用了Java反射,获取人员档案类的所有字段,并且将设置隐私字段的值全部set为“无权限访问”

        首先一点,我们根据类或者对象,就可以获取class对象

    User user = new User();

    // 方式一 类获取

    Class userClass = User.class;

    // 方式二 对象获取

    Class userClass2 = user.getClass();

    // 方式三 静态获取

    Class userClass3 = forName("zwz.pojo.User");

        这个class对象是什么呢?

        Java反射的所有内容,都是围绕这个class对象展开

    类完整路径

    String className = userClass.getName();

    zwz.pojo.User

    包路径

    String packagePath = userClass.getPackage().getName();

    zwz.pojo

    类名

    String simpleClassName = userClass.getSimpleName();

    User

    获取父类

    String fatherClassName = userClass.getSuperclass().getSimpleName();

    People

    获取接口

    Class[] interfaces = userClass.getInterfaces();

     

    根据class创建对象

    User user1 = (User) userClass.getDeclaredConstructor().newInstance();

     

    属性

    获取单个属性

    // 获取单个属性

    Field oneField = userClass.getDeclaredField("code");

    // 获取单个公有属性

    Field onePublicField = userClass.getField("grade");

    获取全部属性

    // 获取全部属性

    Field[] fields = userClass.getDeclaredFields();

    // 获取全部公有属性

    Field[] publicFields = userClass.getFields();

    for (Field field : fields) {

        //让我们在用反射时访问私有变量

        field.setAccessible(true);

        // 属性名

        field.getName();

        // 变量类型

        field.getType().getName();

        // 获取对象中该属性的值

        field.get(user1);

        // set 对象中该属性的值

        field.set(user1,"admin");

    }

    方法

    获取类中单个方法

    // 获取类中单个方法

    Method publicMethod = userClass.getMethod("login", String.class, String.class);

    // 获取类中单个方法

    Method method =  userClass.getDeclaredMethod("login", String.class, String.class);

    获取类所有方法

    // 获取类所有公有方法

    Method[] methods = userClass.getMethods();

    // 获取类所有方法

    Method[] publicMethods = userClass.getDeclaredMethods();

    调用方法

    // 对象 参数

    method.invoke(new User(),"admin","123456");

    构造器

    获取所有构造器

    // 获取所有公有构造器

    Constructor[] publicConstructors = userClass.getDeclaredConstructors();

    // 获取所有构造器

    Constructor[] constructors = userClass.getConstructors();

    单个构造器

    for (Constructor constructor : constructors) {

        // 构造器名称 等同类名

        String name = constructor.getName();

        // 构造器参数

        Parameter[] parameters = constructor.getParameters();

    }

    使用构造器实例化对象

    User user2 = (User) constructors[1].newInstance("admin", "123456", "95.8");

    注解

    获取类的注解

    Annotation[] annotations = userClass.getDeclaredAnnotations();

    获取字段的所有注解

    Annotation[] anns = userClass.getDeclaredField("code").getAnnotations();

    1

    获取字段的单个注解

    Value annValue = userClass.getDeclaredField("code").getAnnotation(Value.class);

    // 注解不存在返回 null

    Controller annController = userClass.getDeclaredField("code").getAnnotation(Controller.class);

    其他代码

    @Data

    @AllArgsConstructor

    @NoArgsConstructor

    public class People {

        private String name;

        private int age;

        public void sayHello(){

            System.out.println("Hello ZWZ!");

        }

    }

    @Data

    @AllArgsConstructor

    @NoArgsConstructor

    public class User extends People implements LoginMapper {

        @Value("admin")

        private String code;

        @Value("123456")

        private String password;

        public String grade;

        @Override

        public boolean login(String code,String password){

            if(code.equals("admin")&&password.equals("123456")){

                System.out.println("code = " + code + "password = " + password + "登入成功");

                return true;

            }

            System.out.println("code = " + code + "password = " + password + "登入失败");

            return false;

        }

    }

    public interface LoginMapper {

        boolean login(String code,String password);

    }

    import org.springframework.beans.factory.annotation.Value;

    import org.springframework.stereotype.Controller;

    import zwz.pojo.User;

    import java.lang.annotation.Annotation;

    import java.lang.reflect.Constructor;

    import java.lang.reflect.Field;

    import java.lang.reflect.Method;

    import java.lang.reflect.Parameter;

    public class ReflexTest {

        public static void main(String[] args) throws Exception {

            User user = new User();

            // 方式一 类获取

            Class userClass = User.class;

            // 方式二 对象获取

            Class userClass2 = user.getClass();

            

            // 类完整路径

            String className = userClass.getName();

            // 包路径

            String packagePath = userClass.getPackage().getName();

            // 类名

            String simpleClassName = userClass.getSimpleName();

            // 获取父类

            String fatherClassName = userClass.getSuperclass().getSimpleName();

            // 获取接口

            Class[] interfaces = userClass.getInterfaces();

            // 根据class创建对象

            User user1 = (User) userClass.getDeclaredConstructor().newInstance();

            

            // 获取单个属性

            Field oneField = userClass.getDeclaredField("code");

            // 获取单个公有属性

            Field onePublicField = userClass.getField("grade");

            // 获取全部属性

            Field[] fields = userClass.getDeclaredFields();

            // 获取全部公有属性

            Field[] publicFields = userClass.getFields();

            for (Field field : fields) {

                //让我们在用反射时访问私有变量

                field.setAccessible(true);

                // 属性名

                field.getName();

                // 变量类型

                field.getType().getName();

                // 获取对象中该属性的值

                field.get(user1);

                // set 对象中该属性的值

                field.set(user1,"admin");

            }

            

            // 获取类中单个公有方法

            Method publicMethod = userClass.getMethod("login", String.class, String.class);

            // 获取类中单个方法

            Method method =  userClass.getDeclaredMethod("login", String.class, String.class);

            // 获取类所有公有方法

            Method[] methods = userClass.getMethods();

            // 获取类所有方法

            Method[] publicMethods = userClass.getDeclaredMethods();

            // 运行方法

            method.invoke(new User(),"admin","123456");

            

            // 获取公有构造器

            Constructor[] publicConstructors = userClass.getDeclaredConstructors();

            // 获取所有构造器

            Constructor[] constructors = userClass.getConstructors();

            for (Constructor constructor : constructors) {

                // 构造器名称 等同类名

                String name = constructor.getName();

                // 构造器参数

                Parameter[] parameters = constructor.getParameters();

            }

            User user2 = (User) constructors[1].newInstance("admin", "123456", "95.8");

            

            // 获取类的注解

            Annotation[] annotations = userClass.getDeclaredAnnotations();

            // 获取字段的所有注解

            Annotation[] anns = userClass.getDeclaredField("code").getAnnotations();

            // 获取字段的单个注解

            Value annValue = userClass.getDeclaredField("code").getAnnotation(Value.class);

            // 注解不存在返回 null

            Controller annController = userClass.getDeclaredField("code").getAnnotation(Controller.class);

            System.out.println("END!");

        }

    }

  • 相关阅读:
    大数据概述 106
    编译原理学习随笔 106
    我与ruby第一次接触
    xml在joomla表单中的应用详解
    joomla2.5传统组件开发解析
    joomla2.5开发系列教程原创(1)2.5与1.5异同点
    CSS2简写和常用css总结笔记
    C语言开发php扩展链接库初学
    ruby转战Ubuntu,真折腾?
    joomla搜索功能开发和结果分页探讨
  • 原文地址:https://www.cnblogs.com/macren/p/13890372.html
Copyright © 2020-2023  润新知