javase-reflect-210709-02

本文详细介绍了Java反射中的Field类的使用,包括获取类的属性、模拟属性的Java代码、读写属性值以及访问私有属性。通过示例代码展示了如何通过反射获取和操作对象的字段,包括其修饰符、类型、名称以及如何进行赋值和取值操作,进一步揭示了Java反射的强大功能。

javase-reflect-210709-02

  • Field 反射的使用
  • Field获取属性
  • Field模拟反射属性的java代码
  • Field获取属性值 / 赋值
  • Field访问私有属性
  • Student.java

Field获取属性

ReflectTest01.java

package bgy_reflect210709_01;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest01 {
    public static void main(String[] args) throws ClassNotFoundException {

        // 获取整个类
        Class studentClass = Class.forName("bgy_reflect210709_01.Student");
        String studentClassName01 = studentClass.getName();
        String studentClassName02 = studentClass.getSimpleName();
        System.out.println(studentClassName01);     // String studentClassName01 = studentClass.getName();
        System.out.println(studentClassName02);     // Student

        // 1. 
        // 获取类中所有的public修饰的Filed
        Field[] fields01 = studentClass.getFields();
        System.out.println(fields01.length);      // 1
        // 取出这个Filed对象
        Field field01 = fields01[0];
        // 取出这个Field的名字
        String fieldName01 = field01.getName();
        System.out.println("获取类中所有的public修饰的Filed个数为:"+fieldName01);

        
        System.out.println("===========================================");


        // 2.
        // 获取所有的Field
        Field[] fields02 = studentClass.getDeclaredFields();
        System.out.println("获取所有的Field个数为:"+fields02.length);    // 4
        // 遍历
        for (Field field : fields02){
            // 01.
            // 获取属性的修饰符列表
            // 获取的只是一个数字,每个数字是修饰符的代号
            int flag = field.getModifiers();
            System.out.println("修饰符代号为:"+flag);
            // 把修饰符代号转换为”字符串“
            String modifierString = Modifier.toString(flag);
            System.out.println(modifierString);
            // 02.
            // 获取属性的类型
            Class fieldType = field.getType();
            System.out.println(fieldType.getSimpleName());
            // 03.
            // 获取Field属性名字
            String fieldName = field.getName();
            System.out.println(fieldName);

            System.out.println();
        }
    }
}

Field模拟反射属性的java代码

ReflectTest02.java

package bgy_reflect210709_01;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest02 {
    public static void main(String[] args) throws ClassNotFoundException {

        // 为了拼接字符串
        StringBuffer s = new StringBuffer();

        // 获取整个类
        Class studentClass = Class.forName("bgy_reflect210709_01.Student");
//        Class studentClass = Class.forName("java.lang.String");

        // Student.java的头儿
        s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+" {");
        s.append("\n");

        // 获取全部的Field对象
        Field[] fields = studentClass.getDeclaredFields();

        // 遍历追加
        for (Field field : fields){
            s.append("\t");

            // 获取Field对象修饰符
            String modifierString = Modifier.toString(field.getModifiers());
            // 获取Field对象类型
            Class fieldType = field.getType();
            String fieldTypeName = fieldType.getSimpleName();
            // 获取Field对象名字
            String fieldName = field.getName();

            // 追加
            s.append(modifierString);
            s.append(" ");
            s.append(fieldTypeName);
            s.append(" ");
            s.append(fieldName);
            s.append(";");
            s.append("\n");
        }

        // Student.java的尾巴儿
        s.append("}");

        // 输出s
        System.out.println(s);
    }
}

Field获取属性值 / 赋值

ReflectTest03.java

package bgy_reflect210709_01;
import java.lang.reflect.Field;

/*
    通过反射获取属性值,或赋值
    反射机制虽然让代码复杂了,但是让整个程序灵活了
 */
public class ReflectTest03 {
    public static void main(String[] args) throws Exception {

        /*
            1. 不通过反射机制,访问一个对象的属性
         */
        Student s = new Student();
        // 赋值三要素:
        // 要素1:对象s
        // 要素2:no属性
        // 要素3:12值
        s.no=12;
        System.out.println(s.no);

        /*
            2. 通过反射机制,访问一个对象的属性
         */
        // 获取类
        Class studentClass = Class.forName("bgy_reflect210709_01.Student");
        // 创建对象
        Object obj = studentClass.newInstance();
        // 获取no属性
        Field noField = studentClass.getDeclaredField("no");
        // 给obj(student)对象属属性赋值
        // 赋值三要素:
        // 要素1:obj对象
        // 要素2:no属性
        // 要素3:22值
        noField.set(obj,22);

        // 获取属性no
        System.out.println(noField.get(obj));

    }
}

Field访问私有属性

package bgy_reflect210709_01;

import java.lang.reflect.Field;

/*
    反射访问私有属性
 */
public class ReflectTest04 {
    public static void main(String[] args) throws Exception{
        // 获取类
        Class studentClass = Class.forName("bgy_reflect210709_01.Student");
        // 创建类
        Object obj = studentClass.newInstance();
        // 得到sex的Field对象
        Field sexField = studentClass.getDeclaredField("sex");
        /*
            打破封装
            打破封装,可能会给不法分子留下机会
            这样设置完后,在外部也是可以访问private的
         */
        sexField.setAccessible(true);
        // 给sex赋值
        sexField.set(obj,false);
        // 取值
        System.out.println(sexField.get(obj));
    }
}

Student.java

package bgy_reflect210709_01;

// 反射属性Field

public class Student {

    /*
        Field----->字段,,,其实就是属性/成员
        4个Field,分别采用了不同的访问控制权修饰符
     */
    public int no;          // Field对象
    protected String name;  // Field对象
    int age;                // Field对象
    private boolean sex;    // Field对象
    public static final double PI = 3.1415926;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值