JavaEE企业开发新技术2

目录

[2.7 Field类的基本概念](#2.7 Field类的基本概念)

文字性概念描述:

Field类

[2.8 Field的基本操作-1](#2.8 Field的基本操作-1)

[2.9 Field的基本操作-2](#2.9 Field的基本操作-2)

分析:

[2.10 Field 的综合练习](#2.10 Field 的综合练习)

总结:

==和equals的区别:

[使用 == 比较](#使用 == 比较)

使用equals比较

2.7 Field类的基本概念

文字性概念描述:

Constructor类用来描述类中所定义的构造方法,

(1)得到类的所有构造方法

Constructor constructors

Class.forName("java.lang.String").getConstructors();

(2)得到类中某个具体的构造方法,在getConstructor中传入参数类型所对应的字节码

Constructor constructor=

Class.forName("java.lang.String").getconstructor(String.class)
使用Constructor类的目的是用来创建相应类的对象

正常情况:

string str=new string("hello");

反射情况:

Constructor con=String.class.getConstructor(String.class)

String str=(string)con.newinstance("hello");

通过反射方式创建对象的过程

Class---->Constructor---->某个类的对象

只有当要用某个类的无参构造方法创建该类对象时,可以省略创建Constructor类对象的这个过程。

Date d=(Date)Class.forName("java.util.Date").newInstance();

注意:java运行环境的缓存中保存了类的无参构造方法所对应的Construtor对象。

Field类

Field类用来表示类中的属性(字段)。

  1. Class.gelFields():得到Class对象的所有字段,返回的是Field数组。
  2. Class.getField(String name)返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公有成员字段。
  3. Field的对象所代表的某一个类的属性,而不是那个类的某一个对象的属性。要得到某个对象对应的属性值,需要通过get(0bject obj)方法与某个对象具体关联。
  4. 对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到。
  5. 对于私有属性要得到它所关联到的对象的值,需通过Field的setAccessible(boolean boolean)方法设置。(boolean类型设置为true就可以访问私有属性)
  6. Field类的getType()方法用来得到字段所属的类型

2.8 Field的基本操作-1

公有属性:

public String sex;

重载的有参构造方法:

java 复制代码
public Person(Integer id,String name,String sex) {

this(id,name);

this.sex=sex;

}

测试类:

java 复制代码
public class Test2 {
	public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {

		Person p1=new Person();
		Class clazz1=p1.getClass();
		System.out.println(clazz1==Person.class);
		
		Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class).newInstance(100,"小明","男");//通过反射创建
		Field[] fields=clazz1.getFields();//得到所有公有的属性
		for(Field f:fields) {
			System.out.println("类型:"+f.getType().getName()+"属性名称:"+f.getName());//输出公有属性
		}
		
		Field field=clazz1.getDeclaredField("name");//设置访问私有的name属性
		field.setAccessible(true);//允许访问私有的属性
		System.out.println(field.get(p));
	}
}

运行结果:

2.9 Field的基本操作-2

通过getDeclaredFields()方法可以得到指定类中定义的所有属性:

代码:

java 复制代码
Field[] fields2=clazz1.getDeclaredFields();//得到该类中定义的所有字段
		for(Field f:fields2) {
			System.out.println("类型:"+f.getType().getName()+"属性名称:"+f.getName());
		}
分析:

Field: 一般情况我们需要调用方法得到该类中定义的字段,要么得到所有的字段,要么得到某一个字段得到字段之后,一般情况我们需要得到该字段在某一个对象上的取值

通常如果我们要拿到某个私有的属性时需要用getDeclaredField("属性名称")方法,用该方法拿到私有属性时,需要用setAccessible(boolean boolean)设置为true,表示允许访问私有的属性,最后看字段在某个对象上的取值,则调用get(object obj)方法就能拿到

2.10 Field 的综合练习

练习:扫描一个对象中所有的字符串类型的属性,并为每一个字符串属性的值后面添加"hello"字符串,然后将这个对象输出。

java 复制代码
private Integer id;

private String name;



public String sex;

int statue;

protected String booldType;
java 复制代码
public Person(Integer id, String name, String sex, int statue, String booldType) {
		this(id,name,sex);//在构造方法体中调用重载的构造方法
		this.statue = statue;
		this.booldType = booldType;
	}
java 复制代码
Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class,int.class,String.class).newInstance(100,"小明","男",1,"O型血");

Field[] fields2=clazz1.getDeclaredFields();//得到该类中定义的所有字段
		for(Field f:fields2) {
			if(f.getType()==String.class) {//判断得到的类型是否是String类型
				f.setAccessible(true);//设置为true可以访问私有属性
				String oldValue=(String)f.get(p);
				String newValue=oldValue.concat("hello");//将得到的属性值后面追加"hello"
				//得到新的属性值之后,还需要将新值设置给原来对象
				f.set(p, newValue);
			}
		}
		System.out.println("设置完新值后的对象是:"+p);

运行结果:

总结:

Class.gelFields()可以得到Class对象的所有字段,返回Field数组。

Class.getField(String name)返回一个 Field 对象,它可以指定公有成员字段。

Field的对象所代表的某一个类的属性,而不是那个类的某一个对象的属性。要得到某个对象对应的属性值,需要通过get(0bject obj)方法与某个对象具体关联。

对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到,可以指定非公有成员字段。

对于私有属性要得到它所关联到的对象的值,需要用到Field的setAccessible(boolean boolean)方法设置。(boolean类型设置为true就可以访问私有属性)

Field类的getType()方法用来得到字段所属的类型

==和equals的区别:

使用 == 比较

Java中的8种基本数据类型(byte,short,char,int,long,float,double,boolean)比较他们之间的值是否相等。

引用数据类型,比较的是他们在堆内存地址是否相等。每新new一个引用类型的对象,会重新分配堆内存空间,使用==比较返回false。

使用equals比较

引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法。

相关推荐
卑微的Coder20 分钟前
python画正方形、平行四边形、六边形、五角星、风车(四个半圆)
开发语言·python
bugtraq202122 分钟前
Fyne ( go跨平台GUI )中文文档-绘图和动画(三)
开发语言·后端·golang
椅子哥29 分钟前
MyBatis操作数据库-XML实现
xml·java·数据库·spring boot·mybatis
2402_857589361 小时前
基于Spring Boot的Java免税商品优选商城设计
java·spring boot·后端
L_cl1 小时前
数据结构与算法——Java实现 7.习题——反转链表
java·开发语言·链表
原机小子1 小时前
嵌入式系统开发利器:深入解析MATLAB嵌入式系统工具箱
开发语言·matlab·fpga开发
我明天再来学Web渗透1 小时前
【java面经】微服务架构速记
java·开发语言·微服务·云原生·架构
唤醒手腕1 小时前
2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)
开发语言·爬虫·python
秦淮渔火1 小时前
单例模式(饿汉式-懒汉式)
java·开发语言·单例模式
蔚一1 小时前
Java设计模式(单例模式)——单例模式存在的问题(完整详解,附有代码+案例)
java·开发语言·单例模式·设计模式