黑马程序员_java学习日记_Java高新技术_反射

--------  android培训,java培训java学习型技术博客、期待与您交流! -------

反射(class类)

在java中就是反射就是把Java类中的各种成分映射成相应的java类。
   反射的作用:
        用于工具,架构,动态开发等开发工程
    三种得到类对象的途径:
       1.Class.forName(“name”)//输入全类名
        2.object.getClass()//得到该对象的类对象
        3.object.class
Constructor 的反射
String str1 = new String(new StringBuffer("abc")); //用Constructor构造此String对象

Constructorconstructor1 = String.class.getConstructor(StringBuffer.class);

String str2 =(String)constructor1.newInstance(new StringBuffer("abc"));

Class.newInstance的作用:调用用默认的构造方法,省去中间Constructor的步骤

    Class.forName("java.lang.String").newInstance();

成员变量的反射

FieldFLY = rp1.getClass().getField("y"); //FLY不是对象上的变量,代表类身上字节码的变量,要用它去取某个对象上对应的值。

  FLY.get(rp1);  //用get取得y的值

暴力反射:取私有变量

  Field FLX = rp1.getClass().getDeclaredField("x");//x为私有变量,所以用此方法

  FLX.setAccessible(true);//设置可用

  System.out.println(FLX.get(rp1));

成员方法的反射

Stringstring ="abc";

    Method methodCharAt = String.class.getMethod("charAt", int.class); //取得String的charAt方法的字节数组

    System.out.println(methodCharAt.invoke(string, 1));//如果底层方法是静态的,该参数可以为null,因为静态方法没有对象。

如果方法的参数列表为数组,用Object数组来传递对象

System.out.println(methodCharAt.invoke(string, new Object[]{new Integer(2)})); //JDK1.4的形式

System.out.println(methodCharAt.invoke(string, new Object[]{2})); //JDK1.5的形式  可以自动装箱

数组的反射

具有相同维数和元素类型的数组属于同一个类型,即具有相同的 Class 实例对象。
代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,非基本数据类型的一维数组,既可以当作Object使用,也可以当作Object[]使用。
Arrays.asList()方法:将数组转换为List。处理int[]和String[]时的差异。
Array工具类用于完成数组反射的操作
怎样得到整个数组的元素类型:无法得到,只能得到具体元素的类型—— a[i].getClass().getName();

ArrayListHashSet比较

nHashCode:由此对象的内存地址换算而来。
n哈希算法:将集合分为若干个储存区域,每个对象可以算出一个哈希码,将哈希码分组,每组分别对应某个储存区域,根据一个对象的哈希码就能确定该对象储存在哪个区域。
HashSet:采用哈希算法的集合。实现了Collection接口,只能存入不同HashCode对象,即只存入不同的对象,如果希望存入具有相同内容的两个对象,则需覆盖对象的HashCode和 equals方法。
ArrayList:实现了Collection接口,对象之间有指定顺序,允许重复元素——即使是同一对象,也会被顺序存入。
提示:当一个对象被存入 HasthSet中后,就不能再修改这个对象中那些参与计算哈希值的字段了,否则,修改后的哈希值与最初存入HashSet的就不相符了,此时HashSet将无法检索到此对象,这也会导致无法从HashSet集合中单独删除当前对象,从而造成 内存泄漏( .. 无用后仍在内存中占用空间 , 从而造成内存的浪费)
反射的作用 实现框架的功能
在写程序的时候无法知道要调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射的方式来做。
InputStream ips = new FileInputStream("config.properties");

  Propertiespr = new Properties();

  pr.load(ips);

  ips.close();

  StringclassName = pr.getProperty("className");

  Collectioncollections =   (Collection)Class.forName(className).newInstance();




--------  android培训,java培训java学习型技术博客、期待与您交流! -------

你可能感兴趣的:(黑马程序员_java学习日记_Java高新技术_反射)