静态导入
import static java.lang.System.out import static java.lang.Math*; import static java.utils.Arrays.*; 自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类 Integet i = 1; //装箱 int j = i; //拆箱 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型。 典型应用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0); //拆箱 LinkedHashMap() 取出数据的时候可以按照存入的顺序 //keySet() for(Object obj : map.keySet()){ String key = obj; String value = map.get(key); } 增强for循环只能取出里面的数据,不能修改里面的数据
枚举的作用 枚举的修饰符必须是私有的。不能被实例化,枚举类可以实现接口,或继承抽象类。 反射,一个类有多个组成部分,例如 :成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。反射用来做框架。 1.加载类 2.解剖出类 java中有一个Class类用于代表某一个类的字节码 Class类既然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName(); forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装 另外两种得到class对象的方式 类名.class 对象.getClass() Class class = Class.forName("");//加载类 Class class1 = new Person().getClass();//加载类 Class class2 = Person.class; //加载类 class2.getConstructor(); //得到public的函数,变量,构造方法 class2.getDeclaredConstructor(); //括号接收可变参数,可以得到私有的构造函数 Class clazz = Class.forName("cn.itcast.reflect.Person"); Constructor c = class.getConstructor(null); //null表述接收无参的构造函数 Person p = c.newInstance(null);. clazz.getConstructor(String.class); Person p = c.newInstance("xxx");. clazz.getConstructor(String.class,int.class); Person p = c.newInstance("xxx",20);. clazz.getDeclaredConstructor(List.class);//接收私有的构造函数 c.setAccessible(true); //暴力反射,破解私有访问权限 Person p = c.newInstance(new ArrayList());. Person p = clazz.newInstance(); //创建对象的另外一种途径,必须要有无参构造函数 利用Method执行对象,反射类的方法 Person p = new Person(); Class clazz = Class.forName("cn.itcast.reflect.Person"); Method method = clazz.getMethod("aa1",null); method.invoke(p,null); //第一个参数是方法跑起来的对象,第二个参数是方法里面带的参数 Method method = clazz.getMethod("aa1",String.class,int.class); method.invoke(p,"zxx",38); Method method = clazz.getMethod("aa1",String.class,int[].class); Class cs[] = (Class[]) method.invoke(p,"zda",new int[]{1,2,3}); System.out.println(cs[0]); Method method = clazz.getDeclaredMethod("aa1",InputStream.class); method.setAccessible(true); method.invoke(p,new FileInputStream("c:\\1.txt")); Method method = clazz.getMethod("aa1", int.class); method.invoke(null,23); //静态的方法在调的时候不需要对象 反射main方法 Method method = clazz.getMethod("main",String[].class); method.invoke(null,new Object[](new String[]{"aa","bb"})); //调用main方法 //method.invoke(null,(Object(new String[]{"aa","bb"}))); //第二种方式 反射字段 Person p = new Person(); Class.forName("cn.itcast.reflect.Person"); Field f = clszz.getField("name"); String name = (String)f.get(p); Class type = f.getType(); if(type.equals(String.class)) String svalue = (String)value; Field f = clazz.getDeclaredField("password"); f.setAccessible(true); 内省 Introspector 开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性 内省访问JavaBean属性的两种方式: 通过PropertyDescriptor类操作Bean的属性 通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。 使用内省api操作bean的属性 //得到bean的所有属性 BeanInfo info = Introsperctor.getBeanInfo(Person.class,Object.class); //后面第二个参数就是指不需要得到的属性,只要继承bean的属性,不要object的属性 PropertyDescriptor[] pds = info.getPropertyDescriptors(); for(PropertyDescriptor pd : pds) System.out.printon(pd.getName()); //操作bean的指定属性:age Person p = new Person(); PropertyDescriptor pd = new PropertyDescriptor("age",Person.class); Method method = pd.getWriteMethod(); method.invoke(p,45); pd.getPropertyType();
泛型Generic JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工 进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如: ArrayList list = new ArrayList(); list.add("abc"); Integer num = (Integer)list.get(0);//运行时会出错,但编码时发现不了 Set<Map.Entry<Integer,String>> set = map.entrySet(); Iterator<Map.Entry<Interer,String> > it = set.iterator(); while(it.hasNext()){ Map.Entry<Integer,String> entry = it.next(); int key = entry.getKey(); String value = entry.getValue(); } for(Map.Entry<Integer,String> entry : map.entrySet()){ int key = entry.getKey(); String value = entry.getValue(); }
|