黑马程序员技术交流社区

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

作者: 段郎    时间: 2014-4-18 12:13
标题: 反射总结
Class是java中所有类的类
反射就是把java类的各成分映射成对应的java类。反射用多了会影响性能
类的实例机制:每一个类原本都是在硬盘上面的,运行时每一个类被加载到内存中,加载进来的都是字节码,也就是class文件,再用这也字节码为一个个该类的对象实例化。通过  对象名称.class 可以得到该对象的类的字节码。实例化Class对象时是用已存在内的字节码实例的。
Class类对象的实例化方式,因为得到字节码的方式多种所以实例化的方式多种:
        1、Class c1=对象名称.getClass
        2、Class c2=Class.forName("带包名的路径名称")
        3、Class c3=类名称.class
每一个类只会有一个字节码,也就是说通过不同的方式实例化该类对应的Class类,得到的对象都是同一个
Class类常用方法
    isPrimitive//判断是否是基本数据类型
    isArray//判断是否是数组数据类型
   Construct  getConstruct()//得到构造方法
Construct
Field
3、Method(代表某个类中的一个成员方法)

得到类中的某一个方法:Method methodchartAt=Class.forName("带包名的路径名称").getMethod(方法名,参数列表)
调用方法:
    a.通常方法:对象名称.chartAt(1)
    b.反射方式:methodchartAt .invoke(对象名,参数列表)
4、Constructor
    Constructor constructors[] Class.forName("类完整路径名").getConstructors();//得到该类的所有构造方法,放在一个数组织中
    也可以通过getConstructor(参数列表1)得到指定构造方法。
    String str=constructor1.newInstance(参数列表2)  实例化,注意:参数列表1和参数列表2要一样的,不然运行时会报错
5、Field
    Point pint=new Point("x",“y”);
    Field fieldy=class.forname("路径").getFiled(“y”)//得到了指定类的字段
    filedy.get(point)//得到point对象的y属性
    需要注意的是field.get()并不能得到y,还需要把该对象point穿进去。
6、通过内省的方式得到 javabean 中的get  set  方法
    PropertyDescriptor pd=new PropertyDescriptor (要得到get、set方法的字段,得到哪个对象的get、set方法)
    Method methodGetX=pd.getReadMethod();//得到了get方法
    Object retval=methodGetX.invoke(对象名)//得到了x的值
作者: 官珺伟    时间: 2014-4-28 07:23
反射指定类中的方法: 
//获取类中所有的方法。 
  public static void method_1() throws Exception { 
  Class clazz = Class.forName("cn.itcast.bean.Person"); 
  Method[] methods = clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。 
  methods = clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。
   for(Method method : methods) { System.out.println(method); 
  } 
  } 
//获取指定方法; 
  public static void method_2() throws Exception { 
  Class clazz = Class.forName("cn.itcast.bean.Person"); 
//获取指定名称的方法。 
  Method method = clazz.getMethod("show", int.class,String.class); 
//想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。 
  Object obj = clazz.newInstance(); 
  method.invoke(obj, 39,"hehehe");//执行一个方法 } 
//想要运行私有方法。 
  public static void method_3() throws Exception { 
  Class clazz = Class.forName("cn.itcast.bean.Person");
 //想要获取私有方法。必须用getDeclearMethod(); 
  Method method = clazz.getDeclaredMethod("method", null); 
// 私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。 
method.setAccessible(true);//一般很少用,因为私有就是隐藏起来,所以尽量不要访问。 } 
//反射静态方法。 
  public static void method_4() throws Exception { 
  Class clazz = Class.forName("cn.itcast.bean.Person"); 
  Method method = clazz.getMethod("function",null);
   method.invoke(null,null); 
  } 




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