反射
2016-09-27 本文已影响40人
我该忘了我自己w_u
Class 类 基础
万事万物皆对象,基本类型(包箱)之后是对象(如:Double 是对象,double 是基本类型)
Food foo1 = new Foo();//foo1表示出来了
//Foo这个类 也是一个实例对象,Class类的实例对象,
//第一种表示方式 -->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1 =Foo.class;
//第二种表达方式,已经该类的对象 加 getClass方法
Class c2 = foo1.getClass();
//c1,c2表示了Foo类的类类型
//第三种方式
Class c3 = null ;
c3 =Class.forName(com.zuojia.ai");
动态加载类
编译 静态加载 运行 动态加载
反射 获取方法名
public static void printClassMessage(Object obj){
//obj 携带了类信息
//要获取类的信息 首先 获取类的类类型
Class c = obj.getClass();
//传递的是哪个子类的对象 c就是该子类的类类型
//获取类的名称
System.out.print("类的名称是: "+ c.getName());
/** * Method 类,方法对象 * 一个成员方法就是一个Method对象 *
getMethods()方法获取的是所有的public的函数,包括父类继承而来的 *
getDeclaredMethods()获取的是所有该类自己声明的方法, */
Method[]ms = c.getMethods();
//c.getDeclaredMethods();
for (int i = 0;i<ms.length; i++){
//得到方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
System.out.println("返回值类类型"+returnType.getName()+" ");
//得到方法名称
System.out.print("得到的方法名 "+ms[i].getName()+"(");
//获取参数类型 -->得到的是参数列表的类型的类类型
Class[]paramTypes = ms[i].getParameterTypes();
for (Class class1 : paramTypes){
System.out.print(class1.getName()+" , ");
}
System.out.println(")");
}
反射 获取属性 成员变量
/** * 成员变量也是对象 * java.lang.reflect.
Field * Feild 类封装了关于成员变量的操作 *
getFields()方法获取的是所有的
public 的成员变量的信息 *
getDeclaredFields获取的是该类自己声明的成员变量的信息 * */
public static void printClassMessage(Object obj){
Class c = obj.getClass();
// Field[] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
// 遍历
for (Field field :fs){
//得到成员变量的类型的类类型
Class fieldType =field.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = field.getName();
System.out.println("成员变量类类型"+typeName+" 成员变量名称"+fieldName);
}
}
反射 获取构造函数
public static void printClassMessage(Object obj){
Constructor [] con = c.getConstructors();
//获得共有的构造方法
Constructor [] cons = c.getDeclaredConstructors();
//自己声明的
for (Constructor constructor:con){
System.out.println("构造函数名 "+constructor.getName() +"(");
//获取构造函数的参数列表-->得到的是参数列表的类类型
Class[] paramTypess = constructor.getParameterTypes();
for (Class cla :paramTypess ){
System.out.println(" 参数名 "+cla.getName());
}
}
}
反射 方法
ArrayList list1 = new ArrayList();
ArrayList<String>list = new ArrayList<String>();
list.add("hey ,zj "); //list 只能加字符串
System.out.println(list.getClass() == list1.getClass());
//输出为ture 说明 变异后 没有范性 范性是提醒 开发人员类型不一致用哒
Class c1=list.getClass();
try {
Method method = c1.getMethod("add", Object.class);
method.invoke(list, 100);
method.invoke(list, 102);
//绕过编译 可以加 int
System.out.println("size:"+list.size());
//所以就不能 遍历 因为 内容不是string类型
// for (String string:list){
// System.out.println(string);
// }
}catch (Exception e)