反射学习总结
Class类(反射的基石)
1.ava程序中的各个Java类属于同一类事物,Class类则用于描述着一类事物。
2.Class类描述的信息有哪些?
类的类名、类的构造函数、方法、成员,类所属包名等等。
3.如何的得到Class类的实例对象
Class c=字节码 。实例对象就是字节码
a.类名.class 例:Class c = String.class
b.对象.getClass() 例:Class c = new Date().getClass();
c.Class.forName(“类名”) 例:Class c = Class.forName("java.lang.String");
注意 基本数据类型的字节码有点特殊
用Class.isprimitive方法来判断是否是基本类型
例:Boolean flag =int.class.isprimitive
如int .class ==Integer.TYPE
而int .class==Integer.class 则是错的
数组的实例对象
Class.isArray()
例:System.out.println(int[].class.isArray());
反射
1.反射就是把Java类中各个成分映射成相应的Java类。
2.Class用Field、Method、Constructor、Package等实例对象来获得Java类中的变量、方 法、构造方法、包、修饰符等。
1.应用
a.Constructor 表示字节码里面的一个构造方法
(若要多个方法则用数组newInstence[])
String str = "dasda";
Constructor con = String.class.getConstructor(StringBuffer.class);
这里是传入参数的类型
用于区分你在获取String类哪一个构造方法
String str2 =(String) con.newInstance(new StringBuffer("abc"));
newInstance是用来Class创建新实例对象的方法
System.out.println(str2);
b.Filed类 表示一个类的字节码里面的一个成员变量
{
ReflectPoint pp1 = new ReflectPoint(3,5);
Field fieldY =ReflectPoint.class.getField("y");
//fieldy的值是指的类上的,要用他去获取某个对象上的对应值
System.out.println(fieldY.get(pp1));
Field fieldX =ReflectPoint.class.getDeclaredField("x");//x是私有的 所以要 用 getDeclaredField("x")
fieldX.setAccessible(true);//暴力获取,,,,私有的 变成可见的但是不能获 取 ,所以要用fieldX.setAccessible(true);来 强行使之可以获取
System.out.println(fieldX.get(pp1));}
class ReflectPoint{
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
经过试验 如果y的前面没用修饰符 ,是无法用getField("y")可以获取到的,可以和x一样的方法 ,用getDeclaredField("y")来获取,由于不是私有的
所以可以不用fieldY.setAccessible(true);
c. Method类 用于获取一个类的字节码里面的类的方法
String str = "ball";
Method charat = Class.forName("java.lang.String").getMethod("charAt", int.class);
System.out.println(charat.invoke(str, 1));
老是后面还讲了个反射main方法的例子 ,对这个有点糊涂,希望有人帮我讲解下。。。。。。
d.Array类 数组的反射
这个程序有点问题
printObject("a111:"+a1);
printObject("a333:"+a3);
printObject("a444:"+a4);
这几句打出来的是哈希值。不知道为什么,希望有谁能解释一下,记得视频里面好像是能打出数字的。
public static void main(String[] args) {
int [] a1= new int[]{1,2,3};
int [][] a3= new int[][]{{1,3},{2,5},{6,5}};
String[] a4 = new String[]{"a","z","f"};
printObject("a111:"+a1);
printObject("a333:"+a3);
printObject("a444:"+a4);
printObject("xyz");
printObject(new int[]{1,2,3});
printObject(new String[]{"haha","hehe","dddd"});
}
private static void printObject(Object obj) {
Class arrclass = obj.getClass();
if(arrclass.isArray()){
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj,i));
}
}
else{
System.out.println(obj);
}
}
}
e框架的反射
是用的eclipse讲解的
首先要在同一个工程下建立一个文件config.properties
文件里面写className=java.util.ArrayList
然后用下面的方法建立新对象
InputStream ips = new FileInputStream("config.properties");
Properties props = new Properties();//Properties 等效HashMap,存储键值对,但是可以存到硬盘上去,初始化时也可以把文件里的键值对提出来
props.load(ips);
ips.close();
String className = props.getProperty("className");
Collection col = (Collection)Class.forName(className).newInstance();
当要框架时 不用改写代码 只需修改文件config.properties 里面的内容
(这个还不是很清楚) |
|