----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Eclipse的使用技巧
1. 切换工作间与导入项目
2. 设置整个workspace的javac和java
3. 绑定快捷键和模版代码
4. 导入已有工程
path与classpath有什么区别?
path 是用于列出可执行文件的搜索路径,path指明他们的位置;首先在当前目录下找,没找着再去path环境变量里找。
classpath 加载java类的路径,只有在classpath 设置的路径中的类才能被加载;首先在指定目录下面找,找不到然后再去当前目录下找。
静态导入
Import 语句可以导入一个类或某个包中所有的类
Import static 语句导入一个类中的某个静态方法或所有静态方法。
例如Math类
可变参数与for循环
可变参数:一个方法接受的参数个数不固定。
可变参数的特点:
只能出现在参数列表的最后
…位于变量类型和变量名之间,前后有无空格都可以。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
For循环增强
语法:for(type 变量名:集合变量名){……..}
注意事项:迭代变量必须在()中定义!
集合变量可以是数组或实现了Iterable接口的集合类。
基本的数据类型的自动装箱与拆箱
自动装箱: Integer num1 = 12;
自动拆箱: System.out.print(num1 +12);
基本数据对象的缓存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 = num2); //返回true
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num1 = num2); //返回false
为什么会打印一个为true 一个为false的结果呢?
原因是:对于基本类型的整数,要装箱成Integer对象的时候,如果这个数字在一个字节之内,也就是-128到127之间的数字,一旦被包装成Integer对象之后,就会把它缓存起来,在一个池里面,当下次又要把一个整数装成Integer对象的时候,我先到缓冲池里面看有没有,如果有就从缓存池中拿,这样就节省了内存空间。这是一种设计模式,享元模式。
枚举
枚举就是让某个类型的变量的取值,只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时,就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举是一个特殊的类,其中的每个元素都是该类中的一个对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName().
带有构造方法的枚举
//带有构造方法的枚举 //枚举内元素的下标从0开始
publicenum WeekDay{
SUN(1),MON,TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
privateWeekDay(int day){
System.out.println("second");
}
}
带有抽象方法的枚举
//带方法的枚举
publicenum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
returnGREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
returnYELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
returnRED;
}
};
publicabstract TrafficLamp nextLamp();
privateinttime;
private TrafficLamp(int time){
this.time = time;
}
Javabena内省
privatestaticvoid setProperty(ReflectPoint p, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
//属性描述符
//在构造函数中指定属性名,指定是哪一个类,把这个类当中javaBean来看。从这个javaBean身上获取这个属性。
PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,p.getClass());
Method methodSetX = pd1.getWriteMethod(); //得到
methodSetX.invoke(p,value);
System.out.println(p.getXx());
}
只要调用这个方法,并给这个方法传递一个对象,属性名和设置值,它就能完成属性的修改功能。
privatestatic Object getProperty(Object obj, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
Object retVal = null;
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName)){
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(obj);
}
}
return retVal;
}
采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的x属性,在程序中把一个类当中JavaBean来看,就是调用Introspector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。
Beanutils工具包
Beanutils工具包提供了对JavaBean的操作。
注解
是用于向javac编译器传递一些信息。
1. 过时了保留在
2. 覆盖 保留在源阶段
3. 警告 保留在源阶段
标记的作用
加了注解等于给程序加上了一种标记。
加了标记,可以用反射来进行相应的动作。
标记可以加在类、包、成员、变量、方法等等上面
注解其实是一种类
注解的格式:
@interface A{}
应用了注解类的类:
@A Class B{}
对应用了注解类的类进行反射操作的类。
Class C {
B.class.isAnnotionPresent(A.class);
A a = B.class.getAnnotion(A.class);
}
注解的生命周期
Java源文件,在被javac翻译成class文件时,可能被去掉,也可能在类加载器加载class文件时被去掉。
@Retention(RetentionPolicy.RUNTIME) 让注解在运行阶段有效。默认是在class阶段。
@Target({ElementType.METHOD,ElementType.TYPE}) 注解用在类或方法上
为注解增加属性
定义基本类型的属性和应用属性
在注解中增加String color();
@MyAnnotation(color=”red”);
@ItcastAnnotation(color = "red",value = "abc")
如果只有一个value属性需要设置时,就可以省略value和等号。
String color() default"blue";
String value();
int[] array() default 0;
如果数组中只有一个元素,这时可以省略大括号
@ItcastAnnotation(color = "red",value = "abc",array = 1)
注解中的属性可以是数组、枚举、注解等
String color() default"blue";
String value();
int[] array() default 0;
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationArr() default@MetaAnnotation("sdfs");
代理类
代理是被代理的类,必须有一个父类或者一个接口,不管是动态代理还是静态代理
最终产生的代理类也会同被代理的类一样继承或者实现相同的类和接口
再把被代理的类的对象传进来给相应的方法增加功能
代理类的作用:为原来的类增加一些功能。 代理类的每个方法要与目标类方法相同。并在调用时加上系统功能的代码。
总结思考:让jvm创建动态代理类及其实例对象,需要给他提供哪些信息?
三方面:
1. 生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知?
2. 产生的类字节码必须有一个关联的类加载器对象。
3. 生成类中的方法代码是怎样的,也得由我们来提供,把我们的代码写在一个约好了接口对象的方法中,把对象传给它,它调用我的方法,即相当于插入了我的代码。提供执行代码的对象就是那个InvocationHandler对象,它是在创建动态代理类的实例对象的构造方法时传递进去的,在上面的InvocationHandler对象的invoke方法中加一点代码,就可以看到这些代码被调用运行了。
用Proxy newInstance方法直接一步就创建出代理对象。
-----------------------android培训、java培训、java学习型技术博客、期待与您交流! ----------------------