------- android培训、java培训、期待与您交流! ----------
反射:
反射就是把Java类中的各种成分映射成相应的java类。
构造方法的反射:
onstructor类代表某个类中的一个构造方法;
得到某个类所有的构造方法:
Constructor [] constructors=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructorconstructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
获得方法时要用到类型:
创建实例对象:
通常方式:String str = newString(new StringBuffer("abc"));
反射方式: String str =(String)constructor.newInstance(new StringBuffer("abc"));
调用获得的方法时要用到上面相同类型的实例对象
Class.newInstance()方法:
String obj =(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。也就是使用String类的无参构造
方法创建了一个String对象。
Filed反射练习
ReflectPointpt1 = new ReflectPoint(3,5);
Field fieldY =pt1.getClass().getField("y");//获取公有的成员变量
System.out.println(fieldY.get(pt1));
Field fieldX =pt1.getClass().getDeclaredField("x");//强行获取私有的成员变量
fieldX.setAccessible(true);//可以获取私有成员变量的值
System.out.println(fieldX.get(pt1));
成员方法的反射(Method):
Method类代表某个类中的一个成员方法。
得到类中的某一个方法:
Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!
数组的反射:
1、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
2、代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
3、基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
无法通过反射直接获得数组中元素的类型,但可以通过其中一个元素获得类型:
a[0].getClass().getName();
泛型的反射:
通过反射获取方法,再获得方法的参数列表的类型,获取其参数的实际类型。
内省
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
内省示例:
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
JavaBean中属性的名称参考自它的get与set方法。
如代码中的setAge()方法,属性名就为age,规则为:
如果set后的第二个字母是小写,则把第一个字母改为小写;
如setTime-à属性为time,setCPU-à属性名为CPU
注解:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
@Deprecated表示该方法已经过时。
@Override表示该方法是重写方法。
自定注解类:
元注解Retention的三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;
分别对应:java源文件-->class文件-->内存中的字节码。 @Target可以定义注解使用的位置。
泛型:
JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。
整个称为ArrayList<E>泛型类型ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念着typeof
ArrayList称为原始类型
参数化类型不考虑类型参数的继承关系,如下两种定义方法是错误的:
Vector<String> v = newVector<Object>();
Vector<Object> v = newVector<String>();
优点:
1.将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
通常在集合框架中很常见,
只要见到<>就要定义泛型。
其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
只有引用类型才能作为泛型方法的实际参数。
泛型类:
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
如有疑问的同学,请参看:http://heimacxy.blog.163.com/blog/static/1903840442011611112028947/ 或 http://www.cnblogs.com/hm-chentao