黑马程序员_反射

来源:互联网 发布:网络水晶头什么牌子好 编辑:程序博客网 时间:2024/06/06 05:08

何为反射,我的理解就是把一个类的各种成分,比如成员变量,方法,构造方法都映射成一个Java类,以便在程序运行的时候,对于任意的一个类,都知道其属性和信息,对于一个对象,可以调用使用其方法。


// 创建一个Class对象的三种方法 内存中字节码文件只存在一份

1. String.class

2.  new String().getClass //知道对象的情况下

3.  Class,forName("java.lang.String") //提供一个类名字符串


构造方法的反射

根据Class对象获得构造方法的对象

Constructor constructor = Class.forName("java.lang.String").getConstructor(); //调用无参数的构造方法

Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//调用带有参数的构造方法,传入的参数是参数类型的字节码


成员变量的反射

Field FLY = rp.getClass().getField("x");//FLY不是对象身上的变量,它是类字节码的变量,要用它去取某个对象对应的值

FLY.get(rp);//传入某个对象

暴力反射,取private变量

Field FLX = rp.getClass().getDeclaredField("x");

FLX.setAccessible(true);//安全检查

FLX.get(rp);


成员方法的反射

String str = "nba";

Method method = String.class.getMethod(charAt,int.class);//传入方法名以及方法的参数类型字节码

char ch = method.invoke(string,2);//对象和参数值,如果方法是静态方法,该参数可以为null,因为静态方法不属于对象,如果方法的参数为数组,用Object[]来传递

System.out.print(ch); //返回a


重点:数组的反射

具有相同维数和类型的数组属于同一个Class对象

int [] a1 = new int[3];

int [] a2 = new int[]{1,3,4,6};

String []  a3 = new String []{"a","b',"c","d"};

结论: a1.getClass == a2.getClass() 返回true ,a1.getClass()==a3.getClass()返回false


基本类型的一维数组可以当做Object类型使用,不能当做Object[] 类型,非基本数据类型的一维数组,既可以当作Object使用,也可以当作Object[]使用.


Arrays.asList()方法:将数组转换为List。处理int[]和String[]时的差异。
Array工具类用于完成数组反射的操作
怎样得到整个数组的元素类型:无法得到,只能得到具体元素的类型—— a[i].getClass().getName();


反射 实现框架功能(不知道类名,从一个配置文件中加载)

class RefecltDemo{


public static void main(Stirng[] args){


InputStream ips = new InputStream("config.properties");//字节读取流读取配置文件
Properties pro = new Properties();//map集合
pro.load(ips);//加载流
String className = pro.getProperty("className");//根据键获得类名
Object obj = (Object)Class.forName("className").newInstance();

}





}







C

0 0
原创粉丝点击