黑马程序员_内省&注解&枚举知识总结

本文深入探讨了Java内省机制的优势及其在属性操作中的应用,并介绍了注解的功能、生命周期与自定义方法,同时解析了枚举的特点与应用场景。

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



------------------------------------------------android培训java培训期待与您交流!-----------------------------------------------

❶内省

①用内省的好处

如果不用内省的,用反射要对某个属性进行取值或者赋值先要知道属性名称,
然后还要对属性名称第一个字母进行大写转换,然后就是拼凑set和get方法
比较繁琐,用内省就比较简便,之前我也写过相关的框架看到这一节内容的
时候明显感觉这样操作更节省时间和代码

②Javabean根据什么推出其属性

一个javabean类有什么属性是根据get和set方法推断出来的

③用属性描述符(PropertyDescriptor)和BeanInfo来对javabean里面的属性进行操作

private static Object getProperty(Object pt1, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		属性描述符:用于获取类的属性
		PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
		获得其get方法
		Method methodGetX = pd.getReadMethod();
		调用get方法
		Object retVal = methodGetX.invoke(pt1);
		Method methodSetX = pd2.getWriteMethod();//获取set方法
		methodSetX.invoke(pt1,value); //调用set方法
		 
		 
		 
		用于一次性获取所有的属性然后for循环出要找的属性值
		BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		Object retVal = null;
		for(PropertyDescriptor pd : pds){
			if(pd.getName().equals(propertyName))
			{
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(pt1);
				break;
			}
		}
		return retVal;
	} 

④BeanUtils里面封装了对属性的操作方便我们使用
BeanUtils的set和get都是以字符串的方式
BeanUtils.setProperty(pt1, "x", "9");
BeanUtils和PropertyUtils的区别在于BeanUtils对数据要进行自动转换而PropertyUtils不转换
PropertyUtils.setProperty(pt1, "x", 9);
java7的新特性
Map map = {name:"zxx",age:18};
BeanUtils对map进行操作
BeanUtils.setProperty(map, "name", "lhm");
因为birthday为Date类型里面含有属性time所以可以进行级联操作 
BeanUtils.setProperty(pt1, "birthday.time", "111"); 

❷注解

①注解的作用

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加则等于没有某种标记,
以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,
就去干相应的事;标记可以加在包,类,字段,方法,方法的参数以及局部变量上

②注解的生命周期(默认是保存在class阶段)

RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME对应与java源文件-->class文件-->内存中的字节码;

③Java.class文件加载到内存要经历2个过程

ⓐjavac在把源文件编译成.class:这个时候会根据注解的生命周期考虑是否把注解去掉

ⓑ类加载把class文件加载到内存:这个的时候根据注解的生命周期考虑是否把注解去掉

④纠正以前错误的认识

以前一直认为.class文件是字节码,这样认为是错误的,class文件里面的内容不是字节码,
而是这样的类加载器把class文件加载到内存里面来之后的那些1010组合的内容才是字节码

⑤定义一个注解

//注解存在生命周期
@Retention(RetentionPolicy.RUNTIME)
//注解使用的范围:Target的默认值为任何元素,{ElementType.METHOD(用在方法上面),ElementType.TYPE(用在类型上面)}
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
	String color() default "blue";//字符串类型
	String value();//适合于指定一个属性的情况
	int[] arrayAttr() default {3,4,4};//数组类型
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚举类型
	MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");//注解类型
}


⑥使用注解

//注解的使用
@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1)
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			注解里面的属性设置的时候以属性的形式用设置,用的时候以方法的形势取值
			System.out.println(annotation.color());
			System.out.println(annotation.value());
			System.out.println(annotation.arrayAttr().length);
			System.out.println(annotation.lamp().nextLamp().name());
			System.out.println(annotation.annotationAttr().value());
		}

枚举

①枚举的作用

要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在
开发阶段无法实现这一目标 ;枚举是一种特殊的类,其中的每个元素都是该类的一个
实例对象枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法

②枚举的重要方法

1.valueOf("")就是得到该字符串对应的枚举类,应用:客户端传递一个字符串,得到该对应的对象

2.values()得到该枚举类里面的所有元素

3.枚举里面的构造方法都是私有的

③带抽象方法的枚举

public enum TrafficLamp{
		RED(30){
			public  TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(45){
			public  TrafficLamp nextLamp(){
				return YELLOW;
			}			
		},
		YELLOW(5){
			public  TrafficLamp nextLamp(){
				return RED;
			}			
		};
		public abstract TrafficLamp nextLamp();
		private int time;
		private TrafficLamp(int time){this.time = time;}
	}


享元模式

把那些基本的很小的整数把他们给缓存起来,哪些地方要使用这个整数就把
这个整数相关的属性设置一下就可以了,而不用再创建一个新的对象有很多
个小的对象,他们有很多属性相同,把它们变成一个对象,那些不同的属性
把它们变成方法的参数称之为外部状态相同的属性称之为内部状态

Integer i3 = Integer.valueOf(213);//如果在-128~127就是相同的
Integer i4 = Integer.valueOf(213);
System.out.println(i3==i4);//false

----------------------------------------- android培训java培训、java学习型技术博客、期待与您交流! --------------------------


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值