黑马程序员_内省&注解&枚举知识总结
来源:互联网 发布:mysql substring函数 编辑:程序博客网 时间:2024/06/05 19:38
------------------------------------------------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.csdn.net/heima
- 黑马程序员_内省&注解&枚举知识总结
- 黑马程序员_内省 注解
- 黑马程序员_java基础加强_静态导入_反射_枚举_注解_内省_泛型_代理
- 黑马程序员_java_基础加强_静态导入_反射_枚举_注解_内省_泛型
- 黑马程序员_反射、内省、注解
- 黑马程序员_内省和注解
- 黑马程序员_反射、内省、注解
- 黑马程序员--高新技术--枚举、反射、注解、类加载器、内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_内省
- 黑马程序员_枚举总结
- java高新技术_枚举反射内省(黑马程序员)
- 黑马程序员—java高新技术_枚举&反射&内省
- golang 里goroutine产生的线程数量
- 如何使用gem5进行指定选项配置模拟自己的程序
- Qt国际化出错导致汉化不完全
- Representation(制图表达)在地图制图中的应用
- 浅谈render_to_response()使用
- 黑马程序员_内省&注解&枚举知识总结
- Android MTP框架和流程分析
- iOS点滴-openSSH使用
- 《Java编程思想》学习笔记17——注解Annotation
- 如何更好的理解SVM算法
- ActivityManager: Warning: Activity not started, its current task has been brought to the front
- select count 多条统计
- 次梯度与次微分
- mysql的基本操作