JAVA-反射学习

原文:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

个人总结:

1. 反射是什么:由字节码文件(.class)获取类文件(.java)相关信息的操作叫做反射。

2. 获取class文件的三种方式

<1> Class.forName("Reflect.Person") ;

<2> Person.class;

<3> new Person().getClass();

3. class 的api

<1> 取得全部的构造函数 

  Constructor<?> cons = demo.getConstructor();

  带参数的构造使用 Constructor<?> cons = demo.getConstructor(String.class)

  可以由此获取一个实例 Person per1 = (Person)cons.newInstance();

<2> 取得该类实现的所有接口

  Class<?> intes[] = demo.getInterfaces();
  for (int i = 0; i < intes.length; i++) {
    System.out.println("实现的接口 "+intes[i].getName());
  }

<3> 取得该类的父类

  Class superClass = demo.getSuperClass();

<4> 获取方法的修饰符(private public protected)(以构造方法为例)

  Class<?> clazz = Class.forName("Package.Demo");

  Construction cosn = clazz.getConstruction(String.class);  //获取参数类型为String的构造函数

  int mo = cosn.getModifies();  //得到的是一个int值

  String priv = Modifier.toString(mo);  //通过此方法可以获取当前方法的修饰符

<5> 获取方法的参数类型

  Class<?> ps[] = cosn.getParameterTypes();  //获取构造函数的参数数组

  ps[i].getName();  //可以得到该构造函数的参数类型 必然是String了

<6> 获取类中所有的方法

  Method methods[] = clazz.getMethods();  //获取当前类中的所有的方法

<7> 获取方法的返回值类型

  Class<?> mclazz = method[i].getReturnType();  

  mclazz.getName();  //获得该方法返回值的类型

<8> 获取属性

  Field fields[] = clazz.getDeclaredFields();  //获取全部的属性 包括private protected

  Field fields[] = clazz.getFields();  //获取所有的public属性

<9> 获取属性的修饰符 属性的类型 属性的名称

  field[i].getModifier();  //private public.....
  field[i].getType().getName();  //String Integer .....

  field[i].getName();  //sex age and so on.....

<10> 调用类中的方法

  Class<?> clazz = Class.forName("Package.Demo");

  Method method = clazz.getMethod("sayHello");  //通过方法名称获取方法

  method.invoke(clazz.newInstance());  //此为不带参数的方法调用

  Method method = clazz.getMethod("sayHello',String.class,int.class);  //通过方法名称获取带参数的方法

  method.invoke(clazz.newInstance(),"pikzas",20);  //带参方法的调用

<11> 调用类的get set方法

class hello {
    public static void main(String[] args) {
        Class<?> demo = null;
        Object obj=null;
        try {
            demo = Class.forName("Reflect.Person");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try{
         obj=demo.newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        setter(obj,"Sex","男",String.class);
        getter(obj,"Sex");
    }

    /**
     * @param obj
     *            操作的对象
     * @param att
     *            操作的属性
     * */
    public static void getter(Object obj, String att) {
        try {
            Method method = obj.getClass().getMethod("get" + att);
            System.out.println(method.invoke(obj));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param obj
     *            操作的对象
     * @param att
     *            操作的属性
     * @param value
     *            设置的值
     * @param type
     *            参数的属性
     * */
    public static void setter(Object obj, String att, Object value,
            Class<?> type) {
        try {
            Method method = obj.getClass().getMethod("set" + att, type);
            method.invoke(obj, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}// end class
上一篇:VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透


下一篇:第12章 MySQL高级管理