1.反射就是把Java类中的各个成分映射成与其相应的java类。例如System有很多方法,System.exit()、Syetem.getPriperties()等等,
这些方法又都属于Method类,System.exit()、Syetem.getPriperties()只是Method类的两个对象。
2.Constructor:所有的构造方法都属于Constructor类。
(1)得到某个类的所有的构造方法:
Constructor[]constructors = Class.forName("java.lang.String").getConstructors();
备注:因为造方法不一定只有一个,所以用一个数组进行存放
(2)因为一个类的构造方法可能有多个,我们有时候只需要得到某个类的某个构造方法:
Constructorconstroctors =Class.forName("java.lang.String").getConstructors(StringBuffer.class);
备注:可以用参数区分造方法,但是jdk1.4及1.4以前getConstructors()的参数不是可变的,所以如果jdk是1.4及1.4以前的版本,可以构造方法的将参数存到一个数组里面,再把数组作为一个参数提供给getConstructors().
3.编译只是把文件转换成相应的二进制,而不是运行,也就是说不会进行“=”的操作。
Constructorconstructor1 = String.calss.getConstructor(StringBuffer.calss);
Stringstr = (String)constructor1.newInstance(new StringBuffer("ww"));
备注:
①因为程序编译时不会运行“=”的操作,所以只会知道constructor1.newInstance(newStringBuffer("ww"))
是个Constructor类型,因此,要让编译器可以知道constructor1.newInstance(newStringBuffer("ww"))是String
类型的,我们就需要在前面加上(String)告诉器。
②因为constructor1是StringBuffer类型的,所以要把“ww”用newStringBuffer("ww")把String类型转换成StringBuffer类型
4.public class ReflectPoint {
privateint x;
publicint y;
publicReflectPoint(int x, int y) {
super();
this.x= x;
this.y= y;
}
}
import java.lang.reflect.Field;
public class ReflectTest{
publicstatic void main(String[] args) throws Exception{
ReflectPointpt1 = new ReflectPoint(3,5);
FieldfieldY = pt1.getClass().getField("y");
System.out.println(fieldY);
System.out.println(fieldY.get(pt1));
}
}
运行结果:publicint ReflectPoint.y
5
原因:int是基本类型,int[]不是object类型,所以jdk1.4处理不了,只能jdk1.5及以上版本处理。
5.同一个文件,比较的时候建议用“==”而不是equals
例如:String[] arr = new String[2];
在比较arr
6.静态方法的使用不需要对象
例如:Method methodCharAt =String.class.getMethod("charAt",int.calss);
methodCharAt.invoke(null,1);//null:表示没有其他对象;1:参数
即:如果Method对象invoke()方法第一个参数是null,则表示该Mehod对象是一个静态方法