java反射机制入门02

Field对象的机制与实现

1、Field对象概述

  1)Java.lang.reflect.Field类,是用于表示类中、接口中属性对象的类。

  2)可以操作类中私有,以及公有等全部属性和属性的信息。 

2、Field对象的常用方法介绍

方法名 释义
getName() 获取属性名称
getType() 获取属性类型
get(Object obj) 取得obj对象中这个属性的值
set(Object obj,Object value) 向boj这个属性赋值value
setAccessible(boolean) 启用/禁用访问控制权限
package com.rainmer.main;

import java.lang.reflect.Field;

import com.rainmer.bean.Book;

public class FieldTest {
    //改方法用于使用传递过来的Class对象获取类中的属性
    public void show(Class c1){
        Field[] fi = c1.getDeclaredFields();//可以获取所有属性,无论公有还是私有
        System.out.println("~~~~~~~~~~~~获取所有有属性(包括私有)~~~~~~~~~~~~~~");
        for(Field ff : fi){
            System.out.println(ff.getName());
            System.out.println(ff.getType());
        }
        System.out.println("~~~~~~~~~~~~只能获取共有属性~~~~~~~~~~~~~~");
        Field[] fi1 = c1.getFields();//只能获取共有属性
        for (Field ff : fi1) {
            System.out.println(ff.getName());//属性名称
            System.out.println(ff.getType());//属性类型
        }
    }
    
    //该方法用于使用传递过来的实体类对象获取属性以及属性的值
    public void show(Object ob){
        System.out.println("~~~~~~~~~~~~~~~通过实体类对象获取属性以及属性的值~~~~~~~~~~~~~~~~~~~");
        Class cl = ob.getClass();
        Field[] fi = cl.getDeclaredFields();
        try{
            for (Field ff : fi) {
                ff.setAccessible(true);//启用访问权限,并不是把私有属性变成共有属性
                System.out.println(ff.getName()+"值"+ff.get(ob));
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        Book bo = new Book();
        bo.setId(1);
        bo.setName("斗破苍穹");
        bo.setType("玄幻");
        
        FieldTest ft = new FieldTest();
        ft.show(Book.class);
        ft.show(bo);
        
    }
}

运行结果:

调用了setName方法
~~~~~~~~~~~~获取所有有属性(包括私有)~~~~~~~~~~~~~~
id
int
name
class java.lang.String
type
class java.lang.String
~~~~~~~~~~~~只能获取共有属性~~~~~~~~~~~~~~
type
class java.lang.String
~~~~~~~~~~~~~~~通过实体类对象获取属性以及属性的值~~~~~~~~~~~~~~~~~~~
id值1
name值斗破苍穹
type值玄幻

原文地址:https://www.cnblogs.com/rainmer/p/4665253.html