---------------------- android培训、java培训、期待与您交流! ----------------------
枚举:
如果枚举只有一个成员时,就可以作为一种单例的实现方式。
枚举就相当于一个类,其中也可以定义构造方法、成员方法、普通方法、抽象方法。
枚举元素必须位于枚举体中的最开始部分,且列表的后面要有分号与其他杨员分隔,
如果枚举中带有构造方法则这个方法必须定义成private的
Overload vs Override:
Overload :方法重载,是指方法名相同参数个数不同、参数类型不同,如果一个方法的参数个数及参数类型都相同只是返回值不同,它也不是方法重载,因为方法重载与返回值无关。
Override:方法重写,方法重写是发生在子类中。方法的返回值类型、方法名、参数列表和父类中的方法完全一致,并且子类的访问级别不能低于父类的访问级别。但如果子类中的这个方法是private的那它就不是重写父类中的方法了,它完全就是另一个方法。
享元模式(flyweight):如果很多很小的对象它们又有很多相同的属性,就把它们封装成一个对象,而那些不同的属性就封装成外部对象作为方法的参数传入,称为外部状态,方法称为对象的内部状态。
反射:
Class 这个类代表内存中的一份字节码,
得到类的字节码有三种方式:
如:类名.class——Class c1=Date.class
对象.getClass()——new Date().getClass();
反射Class.forName("类名")——
用Class.forName(java.util.Date);来返回字节码,返回有两种情况:
1、是字节码已经加载到了虚拟机中只要返回就行
2、是虚拟机中还没有字节码,用类加载器去加载,把加载进来的的字节码缓存到虚拟机中返回
判断是不是原始类型:
String s="abc";
Class c1=s.getClass();
System.out.println(c1.isPrimitive());
System.out.println(int.class.isPrimitive());
System.out.println(int.class==Integer.class);
System.out.println(int.class==Integer.TYPE);
System.out.println(int[].class.isPrimitive());
判断是不是数据类型的Class实例对象:
System.out.println(int[].class.isArray());
反射就是把java类中的各种成分映射成相应的java类
得到某个类所有的构造方法:
Constructor[]constructors=
Class.forName("java.lang.String").getConstructors();
得到某类的一个构造方法:
Constructor constructor=
Class.forName("java.lang.String").
getConstructor(StringBuffer.class);//获得方法时要用到类型
创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=
(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象
Field 类:它代表某个类中的一个成员变量
public class ReflactPoint {
public int x;
private int y;
public String a="abckedg";
public String b="basket";
public String c="telnalPhona";
public ReflactPoint(){}
public ReflactPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return "a:"+a+"b:"+b+"c:"+c;
}
}
Public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
ReflactPoint rp=new ReflactPoint(12,45);
//访问公共的 x
//Field不是对象身上的变量而是类身上的,要用它去取对象身上对应的变量
Field fieldX=rp.getClass().getField("x");
System.out.println(fieldX.get(rp));
//访问私有的y
Field fieldY=rp.getClass().getDeclaredField("y");
fieldY.setAccessible(true);
System.out.println(fieldY.get(rp));
比较两个字节码时要用==双等号,不要用.equals
//练习:把一个对象中所有String类型的变量中的b换成a.
public static void main(String[] args) throws...
ReflactPoint rp=new ReflactPoint();
changeString(rp);
System.out.println(rp);
public static void changeString(Object obj) throws IllegalArgumentException, IllegalAccessException{
Field[] fields=obj.getClass().getFields();
for (Field field : fields) {
if(field.getType()==String.class){
String oldStr=(String) field.get(obj);
String newStr=oldStr.replace("a", "e");
field.set(obj, newStr);
}
}
Method:某个类中的一个成员方法。
得到类中的某一个方法:
Method charAt=
Class.forName("java.lang.String").getMethod("name",parameterTypes)
如:
//得到方法
如methodCharAt=String.class.getMethod("charAt",int.class);
methodCharAt.invoke(str,1);//调用方法
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象,代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.
基本数据类型的一维数组可以被 当作Object类型来使用,不能当作Object[]类型来使用,非基础数据类型的一维数组既可以当作Object类型使用又可以当做Object[]类型使用。
Arrays.asList()方法处理int[]和String[]时是不一样的。
数组的反射:
Array工具类用于完成对数组的反射操作。
ArrayList_HashSet的比较及Hashcode分析:
ArrayList它的底层实现是数组数据结构,是有顺序的集合它中存储的是对象的引用并且其中的元素可以重复
HashSet是它的底层实现是哈希表,它所存储的元素不允许重复。
Hashcode的作用:
改hashcode时容易造成内存泄漏。
加载配置文件的三种方法:
InputStream is=new FileInputStream("文件名");
InputStream is=
Person.class.getClassLoader().getResourceAsStream("路径");
InputStream is=Person.class.getResourceAsStream("文件名");
内省:IntroSpector——》JavaBean——特殊的Java类
当Java运行时可检查自身,Java 程序中询问它的一个对象属于何类,然后检查该类构成。
注解:一个注解就是一个类
Java.lang包中JDK中提供的最基本的annotation
@SuppressWarning("deprecation"):在已过时的方法前加上。
@Deprecated:加在已经不用的方法前表示已过时。
@Override:表示方法是重写的。
注解相当于一种标记,在程序中加 了注解就等于为程序打上了某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你在包、类、字段、方法、方法参数以及局部变量上。
注解类:
元注解:在java.lang.annotation包下RetentionPolicy.RUNTIME:默认是在class阶段
分别对应:java源文件—》class文件—》内存中的字节码(生命周期)
@Retention(RetentionPolicy.RUNTIME)这个注解是在注解类身上加的注解称为(元注解)
@interface A{
}
应用了“注解类”的类:
@A
Class B{
}
对应用了“注解类”的类进行反射操作的类:
Class C{
B.class.isAnnotionPresent(A.class);
A a=B.class.getAnnotion(A.class);
}
泛型:
使用泛型可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。
参数化类型不考虑类型参数的继承关系:
创建数组实例时,数组的元素不能使用参数化的类型。
泛型中的通配符:?这个通配符可以表示任意类型,它不等同与Object。通配符可以调用与参数化无关的方法,不能调用与参数化有关的方法。
类加载器:
Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:
BootStrap:jre/lib/rt.jar
ExtClassLoader:jre/lib/ext/*.jar
AppClassLoader:classPath指定的所有jar 或目录
类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这就是BootStrap.
Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
自定义的类加载器必须继承ClassLoader
有包名的类不能调用无包名的类。
ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
当每个类加载器在加载类时,先委托给上级去加载这个类,这就是类加载器的委托机制。
自定义一个类加载器对一个class文件进行加密,在解密的时候只能调用自定义的这个类加载器
代理:
JVM可以在运行期间动态生成出类的字节码,这种动态生成的类往往被用作代理类, 即动态代理。JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的工代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理就可以使用CGLIB库
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
1、在调用目标方法之前
2、在调用目标方法之后
3、在调用目标方法前后
4、在处理目标方法异常的catch块中
AOP:
工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象。
---------------------- android培训、java培训、期待与您交流! ----------------------