• 通过反射机制获取class中的属性


    Student类:

    package com.javaSe.bean;
    // 反射属性Field
    public class Student {
        
        // Field翻译为字段,其实就是属性/成员
        // 4个Field,分别采用了不同的访问控制权限修饰符。
        private String name; // Field对象。
        protected int age;
        boolean sex;
        public int no; // Field对象。
        public static final double MATH_PI = 3.1415926;
    }

    通过反射机制获取Student中的属性案例1:

    package com.javaSe.reflect;
    
    
    
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    
    /*
    反射Student类中的所有的Field(了解一下)
    */
    public class ReflectTest05 {
        public static void main(String[] args) throws Exception{
            // 获取整个类
            Class c = Class.forName("com.javaSe.bean.Student");
            
            // com.javaSe.bean.Student
            String className = c.getName(); // 获取的是完整类名
            System.out.println("完整类名" + className);
            
            String simpleName = c.getSimpleName(); // 获取的是简类名
            System.out.println("简类名" + simpleName);
            
            // 获取类中所有public修饰的Field
            Field[] fields = c.getFields();
            System.out.println(fields.length); // 测试数组中只有一个元素
            
            // 取出这个Field
            Field f = fields[0];
            
            // 取出这个Field他的名字
            String fieldName = f.getName();
            System.out.println(fieldName);
        
            System.out.println("==============================================");
            
            // 获取所有的Field
            Field[] fs = c.getDeclaredFields();
            System.out.println(fs.length);
            
            for(Field field : fs){
                // 获取属性的修饰符列表
                int modifiers = field.getModifiers();// 返回的修饰符是一个数字,每个数字是修饰符的代号!
                System.out.println(modifiers);
                
                // 可以将这个“代号”数字转换成“字符串”吗?
                String mdifierString = Modifier.toString(modifiers);
                System.out.println(mdifierString);
                
                
                // 获取属性的类型
                Class fileType = field.getType();
                // String fName = fileType.getName();
                String fName = fileType.getSimpleName();
                System.out.println(fName);
                
                // 获取属性的名字
                String fieldsName = field.getName();
                System.out.println(fieldsName);
            }
        }
    }

    通过反射机获取类中的属性

    package com.javaSe.reflect;
    
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    
    /*
    通过反射机制(了解一下)
    */
    public class ReflectTest06{
        public static void main(String[] args) throws Exception{
            
            // 创建这个是为了拼接字符串
            StringBuilder s = new StringBuilder();
            
            // Class studentClass = Class.forName("com.javaSe.bean.Student");
            Class studentClass = Class.forName("java.lang.Thread");
            
            s.append(Modifier.toString(studentClass.getModifiers()) +  " class "+ studentClass.getSimpleName() +" {
    ");
            
            Field[] fields = studentClass.getDeclaredFields();
            for(Field field : fields){
                s.append("	");
                s.append(Modifier.toString(field.getModifiers()));
                s.append(" ");
                s.append(field.getType().getSimpleName());
                s.append(" ");
                s.append(field.getName());
                s.append(";
    ");
            }
        
            s.append("}");
        
            System.out.println(s);
        }
        
    }

    通过反射机制给一个java对象赋值和获取值

    package com.javaSe.reflect;
    
    
    import com.javaSe.bean.Student;
    
    
    import java.lang.reflect.Field;
    
    
    /*
    必须掌握:
        怎么通过反射机制访问一个java对象的属性?
            给属性赋值set
            获取属性的值get
            
    */
    public class ReflectTest07 {
        public static void main(String[] args) throws Exception{
            
            /*// 我们不使用反射机制,怎么去访问一个对象的属性呢?
            Student student = new Student();
            
            // 给属性赋值
            student.no = 1111; // 三要素: 给s对象的no属性赋值1111
                               // 要素一:对象s
                               // 要素二:no属性
                               // 要素三:1111
            
            // 读取属性
            // 两个要素:获取s对象的no属性的值
            System.out.println(student.no);*/
            
            // 使用反射机制,怎么去访问一个对象的属性。(set get)
            Class studentClass = Class.forName("com.javaSe.bean.Student");
            
            Object obj = studentClass.newInstance();// obj就是Student对象。(底层调用无参数构造方法)
            
            // 获取no属性(根据属性的名称来获取Field)
            Field noField = studentClass.getDeclaredField("no");
            
            // 给obj对象(student对象)的no属性赋值
            /*
            虽然使用了反射机制,但是三要素还是缺一不可:
                要素1:obj对象
                要素2:no属性
                要素3:2222
             注意:反射机制让代码复杂了,但是为了一个“灵活”,这也是值得的。
             */
            noField.set(obj,2222);// 给obj对象的no属性赋值2222
            
            // 读取属性的值
            // 两个要素:获取obj对象的no属性的值。
            System.out.println(noField.get(obj));
            
            // 可以访问私有的属性吗?
            Field nameField = studentClass.getDeclaredField("name");
            
            // 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)
            // 这样设置完之后,在外部也是可以访问private的。
            nameField.setAccessible(true);
            
            // 给name属性赋值
            nameField.set(obj,"zhangsan");
            // 获取name属性的值
            System.out.println(nameField.get(obj));
        }
    }
  • 相关阅读:
    Linux安装Jenkins
    python实现寻找目录中最新的文件
    python代码实现邮件发送
    面向对象(一) 类与类之间的关系之依赖和关联
    常见模块(五) random模块
    装饰器如何装饰带参数的函数
    常见模块(四) os模块
    常见模块(二) logging模块
    常见模块(三) pickle模块和json模块
    初识模块
  • 原文地址:https://www.cnblogs.com/xlwu/p/13612738.html
Copyright © 2020-2023  润新知