黑马程序员------反射的深入学习(No.2)(反射与框架、内省及JavaBaen)

本文深入探讨了HashCode方法的重要性及其与equals方法的关系,并通过具体示例展示了如何正确使用这两个方法来避免内存泄漏等问题。此外,文章还介绍了Java反射机制的基本应用,包括如何利用反射创建对象及读取和设置JavaBean属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------------- 

 

 

微笑ArrayList、HashSet的比较及HashCode分析

 

只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的HashCode方法,

但是只为它提供一个hashCode方法也不会有什么不好,没准以后又用到这个方法了,所以,通常要求hashCode和equals方法同时覆盖。

 

提示:

1.通常来说,一个类的两个实例对象用equals方法比较的结果相等时,它们的哈希码必须相等,反之则不成立,即equals方法

  比较结果不想等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果肯定不想等。例如字符

  串"BB" 和"Aa"的equals方法比较结果肯定不同,但是他们的hashCode方法返回值相等

2.当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希

  值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去

  HashSet中检索对象,也将返回找不到对象的结果,这会导致无法从HashSet中单独删除当前对象,从而造成内存泄漏。

package com.lee.demo;

import java.util.*;

public class ReflectTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//Collection coll = new ArrayList();
		Collection coll = new HashSet();
		ReflectPoint pt1 = new ReflectPoint(1, 1);
		ReflectPoint pt2 = new ReflectPoint(2, 2);
		ReflectPoint pt3 = new ReflectPoint(1, 1);
		
		coll.add(pt1);
		coll.add(pt2);
		coll.add(pt3);
		coll.add(pt1);
		
		//pt1.x=3;  会导致内存泄漏
		coll.remove(pt1);
		
		System.out.println(coll.size());
	}

}

 

微笑反射的作用-->实现框架功能

 

工具类被用户调用,而框架则是调用用户提供的类

 

核心问题:因为写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做。

 

类加载器的使用方式看代码

package com.lee.demo;

import java.io.InputStream;
import java.util.*;

public class ReflectTest1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		//由配置文件读取配置参数
		//一定要记住用完整的路径,但完整路径不是硬编码,而是运算出来的。
		//InputStream inputStream = new FileInputStream("config.properties");
		InputStream inputStream = ReflectTest1.class.getClassLoader().getResourceAsStream("com/lee/demo/config.properties");
		//InputStream inputStream = ReflectTest1.class.getResourceAsStream("config.properties");
		Properties prop = new Properties();
		prop.load(inputStream);
		inputStream.close();
		String className = prop.getProperty("className");
		
		//反射的方式创建对象
		Collection coll = (Collection)Class.forName(className).newInstance();

		ReflectPoint pt1 = new ReflectPoint(1, 1);
		ReflectPoint pt2 = new ReflectPoint(2, 2);
		ReflectPoint pt3 = new ReflectPoint(1, 1);
		
		coll.add(pt1);
		coll.add(pt2);
		coll.add(pt3);
		coll.add(pt1);
			
		System.out.println(coll.size());
	}

}


微笑内省及JavaBean

 

IntroSpector-->JavaBean-->特殊的java类

 

getAge->Age-->如果第二个字母是小写的,则把第一个字母变成小的-->age

gettime-->time

getTime-->time

getCPU-->CUP

package com.lee.demo;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class IntroSpector {

	/**
	 * 内省的操作
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		ReflectPoint2 pt = new ReflectPoint2(2,3);
		String propertyName = "x";
		//读取pt对象的属性
		PropertyDescriptor pd = new PropertyDescriptor(propertyName , ReflectPoint2.class);
		Method readMethod = pd.getReadMethod();
		Object reVal = readMethod.invoke(pt);
		System.out.println(reVal);
		
		//设置pt对象的属性值
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName , ReflectPoint2.class);
		Method writeMethod = pd2.getWriteMethod();
		writeMethod.invoke(pt, 4);
		System.out.println(pt.getX());
	}

}


 

 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

详情请查看:http://edu.youkuaiyun.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值