黑马程序员技术交流社区

标题: 反射学习总结 [打印本页]

作者: 徐方锐    时间: 2016-5-27 00:24
标题: 反射学习总结
反射学习总结
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  里面的内容
(这个还不是很清楚)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2