corejava_反射

反射

类对象 Class类的对象

----------------------------------------

//打印className这个类中所有公开方法

static void printMethods(String classsName) throws Exception{

  Class c = Class.forName(className);

  Method[] ms = c.getMethods();

  for(Method m:ms){

    System.out.println(m.getName());

  }

}

//根据类名 创建对象

static Object createObject(String className) throws Exception(

  Class c = Class.forName(className);

  return c.newInstance();

)

//根据方法名 调用方法

static Object methodInvoke(Object o,String methodName) throws Exception{

  Class c = o.getClass();

  Method m = c.getMethod(methodName);

  return m.invoke(o);

}

-------------------------------------------

获得类对象的引用,三种

1)Class c1 = HashMap.class;

2)Object o = new HashMap();

  Class c2 = o.getClass();

3)String className = "java.util.HashMap";  //类名写全名,包不能省

  Class c3 = Class.forName(className);

-------------------------------------------

java.long.reflect

Field  封装属性信息属性对象

Method  封装一个方法的信息

  getMethods():返回类中所有公开方法,包括父类方法

  getDeclaredMethods():返回本类中所有方法,包括非公开方法

Constructor  封装构造方法

-------------------------------------------

c.getName()  //类名

c.getSimpleName()  //简单类名

c.getSuperclasss().getName()  //父类

Class[] cs = c.getInterfaces();

for(Class ic : cs){System.out.println(ic.getName());}  //接口

 ---------------------------------------------

用 类对象 创建 类的对象

Class c = Class.forName("chp15.Student");  //Student o = new Student();

Object o = c.newInstance();          //

---------------------------------------------

通过反射调方法

1方法对象找出来  Method m1 = c.getDeclaredMethod("study");  //o.study();

2对方法对象调方法  m1.invoke(o);  //对引用o调用无参的study方法 // 

Method m2 = c.getDeclaredMethod("study",String.class);  //o.study(corejava);

m2.invoke(o,"corejava");                  //

-----------------------------------------------

反射 绕开封装,访问私有方法

Method m1 = c.getDeclaredMethod("study");

m1.setAccessible(true);

m1.invoke(o);

posted @ 2016-09-01 17:02  赤叶  阅读(122)  评论(0编辑  收藏  举报