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值玄幻

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏风中追风

java类的加载过程和类加载器的分析

我们知道,我们写的java代码保存的格式是 .java, java文件被编译后会转换为字节码,字节码可以在任何平台通过java虚拟机来运行,这也是java能够跨...

56780
来自专栏醒者呆

大师的小玩具——泛型精解

掌握Java的泛型,这一篇文章足够了。 关键字:泛型,Iterable接口,斐波那契数列,匿名内部类,枚举,反射,可变参数列表,Set 一般类和方...

47350
来自专栏醒者呆

编程语言的基础——搞定JavaIO

关键字:IO基础,JUnit生命周期,字节流,字符流,字符编码,对象流,序列化,反序列化 Java I/O 流是一组有顺序的,有起点和终点的字节集合。是对设...

42250
来自专栏咖啡的代码人生

JAVA 泛型

命名类型参数 推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++ 模板的比较),并反映了...

433100
来自专栏醒者呆

正则表达式——Java程序员懂你

正则表达式 关键字:正则表达式,Pattern,Matcher,字符串方法,split,replace 前文书立下了一个flag,这里要把它完成,就是正则...

40050
来自专栏咖啡的代码人生

IntelliJ IDEA 缺少 javax 包 支持

在初次使用 IntelliJ IDEA 中,当你使用javax.servlet包下的类时(例:javax.servlet.http.HttpServlet),...

57780
来自专栏咖啡的代码人生

IntelliJ IDEA 使用JSTL标签库(IDEA 加载 tld文件)

这两天在 IntelliJ IDEA 中 使用 C标签(JSTL)的时候发现引入进来有问题,不但没提示而且还有红色警告,所以经过一番谷歌的查找之后解决了这个问...

84240
来自专栏咖啡的代码人生

Java static 静态方法 并发(是否线程安全)

public class TestUitl { public static User setName(User user,String name) { ...

1.2K60
来自专栏醒者呆

掌握NIO,程序人生

就像新IO为java带来的革新那样,让我们也开启一段新的程序人生。 关键字:NIO,BIO,伪IO,AIO,多路复用选择器,通道,缓冲区,jdk研究,回...

50060
来自专栏我的博客

Packer JavaScript en PHP

官网:http://joliclic.free.fr/php/javascript-packer/en/ 例子:code pack(); file_put_co...

33230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励