笔记10-15

来源:互联网 发布:算法设计 编辑:程序博客网 时间:2024/05/18 18:54
016 反射类的字段

class对象.getField(“字段名”)获取字段
field.get(对象名)得到值,需要强转
field对象的getType()方法来得到字段的类型
field的set(对象,值)来设置字段的值
访问私有值时同样使用declared方法并设置权限

例:

import static java.lang.System.out;import java.lang.reflect.Constructor;import java.lang.reflect.Field;public class Main {public static void main(String[]arg){try {Class p=Class.forName("Person");Constructor c=p.getConstructor();Person pe=(Person)c.newInstance();Field field=p.getDeclaredField("age2");c.setAccessible(true);field.set(pe,"txc");out.println((String)field.get(pe));} catch (Exception e) {e.printStackTrace();}}class Person{public String age2;public Person(){};}



017 内省操作javabean的属性

Javabean用于封装用户数据的Java类
javabean指javabean中的get和set方法指向的属性,无论其指向的属性是否存在
introspector类
getBeanInfo进行内省,得到其所有属性,方法和事件
其参数为一个bean对象的class对象得到beaninfo对象,然后通过调用getWriteMethod和getReadMethod
 getPropertyDescriptors得到属性描述器数组,如果在geBeanInfo参数后加父class对象,则可以去掉所有相关从父类中继承的属性
可以用PropertyDescriptor的构造方法(属性名,class对象)之后再调用getWriteMethod方法来获得相关函数的methods方法
调用PropertyDescriptor的getPropertyType方法来得到其类型

例:

import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;public class Main {public static void main(String[]arg){try {BeanInfo bean=Introspector.getBeanInfo(Person.class);//获得bean对象PropertyDescriptor[]property=bean.getPropertyDescriptors();//获得属性描述对象PropertyDescriptor pro=new PropertyDescriptor("age",Person.class);//也可以通过构造方法来得到属性描述对象for(PropertyDescriptor obj:property){Method method1=obj.getReadMethod();Method method2=obj.getWriteMethod();System.out.println(method1.getName()+" "+method2.getName());}catch (IntrospectionException e) {e.printStackTrace();}}}}class Person{private int age;private String name;public Person(){this.age=10;name="name";}public int getAge(){return age;}public void setAge(int age){this.age=age;}public String getName(){return name;}}



018 使用beanUtils操纵javabean

使用BeanUtils.setProperty(对象名,变量名,值)来调用对象的属性方法来改变其值。多用于封装表单传过来的键值对。

方法可以将传过来的字符串类型自动转换成八种基本数据类型,默认只支持基本数据类型。如果需要其他数据类型赋值,需要使用类型转换器

ConvertUtils.register(Converter,Class)前参数为继承Converter的接口类,重写其中convert方法,返回相应需要转换的类型

传入相关数据时需要先对数据的合理性进行检查

字符串的trim方法用于除掉字符串前后的空格

下层方法在出现异常时为了保证虚拟机连续运行,出现异常时需要通知上层来保证异常抛出一直到达最上层

常用引用数据类型在beanUtils中有相关的转化的转化器类型

在服务器上传Map对象时,可以使用populate(对象名,map对象)方法,将map键中的值填充给对象中相同名称的属性

例:(未完成)



019 自定义泛形方法和泛形类

泛型允许程序员在编写集合代码的时候就限制集合中的元素,以此来提高程序的稳定性。

例:

Map<String,Integer>map=new HashMap<String,Integer>();map.put("aa",1);map.put("bb",1);map.put("cc",1);Set<Map.Entry<Integer,String>>set=map.entrySet();
HashMap会根据关键字顺序来排列键值对顺序,按添加顺序需要使用LinkedHashMap


使用泛型时,其中的类型须为引用类型,不能是基本数据类型


在使用泛型时,声明和分配内存的泛型必须相同,但当声明处有泛型而分配内存时没有泛型或者声明处有泛型而分配内存时没有时,为了java兼容性,编译可以通过


编译器生成的带泛型的程序后,其代码中不带泛型。这个过程称为“擦除”


泛型的基本术语
例:ArrayList<E>
<>称typeof
ArrayList<E>中的E称为类型参数变量
Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型(ParamterizedType)



020 自定义泛形方法和泛形类

带泛形参数的方法来调用的时候,系统会自动根据传入的参数来确定泛形参数的值
例:public void testa(){a("aaa")};
public<T>T a(T t){return null;}//在方法中出现泛形时需要在方法前面声明泛形类型参数,也可以直接在类上声明泛形
//使用泛形后,返回后的值不需要强转

类的声明只对类的非静态成员有效,对静态成员无效

例:

public<T>void reverse(T[]arr){int s=0,e=arr.length-1;while(s<e){T temp=arr[s];arr[s]=arr[e];arr[e]=temp;s++;e--;}}

0 0
原创粉丝点击