---------------------- android培训、java培训、期待与您交流! ----------------------
反射的基石-->Class(首字母要大写)和用来定义类的class要区别开;
java的中的各个类属于同一个事物,用来描述这同一个事物的属性的就是就是Class;
Class的一个实例就是一个类的字节码;
如何得到字节码的实例对象:
1.用类名 .class ;2.实例对象.getClass();3.Class.forName("类名");
九个预定义的Class对象:八个基本数据类型和void关键字;
Interger.type==int.class(基本数据类型整数int的那份字节码);
只要在源程序中出现的类型,都有各自的class实例对象;
反射就是将一个类的各种成分,比如方法,包什么的都解析为一个类;field(字段,成员变量),method(方法),constructor,package;
Constructor程序的实例:
import java.lang.reflect.*;
class Myconstructor
{
int x=1;
public Myconstructor(){}
public Myconstructor(int x)
{
this.x=x;
}
public static void main(String[] args) throws Exception
{
Constructor c1=Myconstructor.class.getConstructor(int.class);
System.out.println(c1.newInstance(5));//不加5则会运行时发生构造函数参数不匹配的错误,说明经过constructor的折腾,新产生的对象只有符合int.class的构造函数。自己怀疑产生了一个只有构造函数的实例,因为加了.x 后打印会出错
}
}
反射比较影响程序性能;
Field所代表的不是某个类对象的成员变量的具体的值,而只是这个类的变量本身,可以用field.get( 对象名);
Field的实例:
import java.lang.reflect.*;
class ReflectPoint
{
private int x;//没有public的话,getfield就读取不到,其他三种都不行,都尝试过了,
//改成getDeclaredField,则四种类型都可以读取
private int y;
public ReflectPoint(int x,int y)
{
this.x=x;
this.y=y;
}
public static void main(String[] args) throws Exception
{
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldX=pt1.getClass().getDeclaredField("x");
// Field fieldX=pt1.getClass().getField("x");
System.out.println(fieldX.get(pt1));
Field fieldY=pt1.getClass().getDeclaredField("y");
System.out.println(fieldY.get(pt1));
}
}
Method代表一个类里面的方法
用反射的方法来返回某个类的main方法,(为什么要用反射这种看似麻烦的方法来调用某类的main方法呢?直接写类名.main()方法不是更方便吗?但是如果写程序时并不知道某类的类名呢?这个类名如果是用参数传进来的呢?显然就只能用反射来调用这个编写程序时并不知道其类名的main方法了)
【数组的反射】
具有相同类型和维数的数组都属于同一个类;
反射的综合案例
相对路径既不是相对于java命令,也不是相对于所执行的类,而是相对于当前路径。
---------------------- android培训、java培训、期待与您交流! ----------------------