透彻分析反射的基
反射的基石class类
java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。
对比提问:众人用一个类怎么表示?众多的java类用一个什么类表示?
人 》person;Java类》Class
对比提问person类代表人,它的实例化对象就是张三,李四这这样一个个具体的人,Class类代表java类,
Java的实例化对象对应:
对应各个类在内存中的字节码。
一个类被加载器加载到内存中,占有一片存取空间,这个空间里的内容就是类的字节码,不同的类的字节码是不同的,
所以,这一个个空间分别用一个个的对象来表示,这些对象显然具有相同的类型。
Class--代表一类怎样的事物?
person p1=new person();
person p2=new person();
Date
Math
Class cls1=Date.Class//字节码1;
Class cls2=Date.Class//字节码2;
p1.getClass();
Class.forName("java.lang.Stirng")
如何得到各个字节码对应的实例对象(Class类型)
public static void main(String[] args)
{
integer iobj=3;
system.out.println(iobj+12);
stirng s1=new String("abf");
stirng s2=new String("abf");
integer i1=137;
integer i2=137;
system.out.print(i1==i2);
integer i3=integer.valueof(231);
integer i4=integer.valueof(231);
}
public static void main(string[] args)
{
String strl="abc";
Class cls1=str1.getClass();
Class cls2=String.Class;
Class cls3=Class.forName("java.lang.String");
systen.out.println(cls1==cls2);
systen.out.println(cls1==cls3);
sysm.out(cls1.isprmitive());
sysm.out(int.Class.isprimitive());
sysm.out(int.Class==Integer.class);
sysm.out(int.class==integer.TYPE);
sysm.out(INT[]Class.isprimitive());
sysm.out(int[]clss.isprimitive());
九个预定义Class实例对象
成员变量的反射
Field类
field类代表某个类的一个成员变量
演示用eclipse自生成java类构造方法
new String(new StringBuffer("abc"));
Constructor constructor1=string.Class.getConstructor(string[] args)
String str2=(String)constructor1.newInstance();
system.out.println(str2.charAt(2));
peflectPoint pt1=new peflectPoint(3,5);
Field fiedy=pt1.gerClass().getField("y");
//Filldy 的值是多少?
system.out.print(fieldY.getField("x"));
fieldx.setAccessible(true);
system.out.print(fieldx.get(pt1));
反射就是java类中的各种成分映射相应的jiva类。
一个类中的每个成员都可以用相应的反射APi类的一个实例对象来表示.
通过调用class方法来调用对象.
构造方法的反射应用
Constructor类
.得到某个类所有的构造方法:例子:
ClassforName("java.lang.String')getConstructors();
得到某一个构造方法:
constructor constructor=ClassforName("java.lang.string").getConstructor(StringBuffur.Class);
创建实例化对象:
通常方式:String str=new stirng(new StringBuffer("abc"));
反射方式:String str=(String)constructo.newlnstance(new StringBuffer("abc"))
Method 类
method类代表某个类中的一个成员方法
得到类中的某一个方法:
ClassforName("java.lang.String")getMEthod("charAr".int.Class);
jdk1.4和jdk1.5的invoke方法的区别:
jdk1.5:public Objectinvoke(objectOBject.args)
jdk1.4:public Objectinvoke(objectobj.OBject[]args),
jdk1.4需要定义一个数组.
}
|
|