反射
类对象 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);