通过反射机制获取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));
    }
}
原文地址:https://www.cnblogs.com/xlwu/p/13612738.html