A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 迦南 中级黑马   /  2014-8-24 23:51  /  1585 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文


静态导入
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();
}


8 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
留个脚印!
回复 使用道具 举报
好全面的东西                                                         
回复 使用道具 举报
还不错,,可以参考学习一下,,:)
回复 使用道具 举报
这帖子貌似给了我加分的灵感
回复 使用道具 举报
谢谢提供
回复 使用道具 举报
good job!!!
回复 使用道具 举报
dhgcy 中级黑马 2014-8-26 13:59:19
9#
很值得收藏   方便学习,比较提升
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马