Class类
java中类是谁的对象?
类是对象,类是java.lang.Class类的实例对象(there is a class named Class)
表达方式
Class c1 = 类.class;
Class c2 = 实例.getClass();
Class c3 = Class.forName("类的全称");//会有异常抛出
c1 c2 表示某个类的类类型(class type)
通过类类型创建对象
c2.newInstance();//需要做类型的强制转换,并且类需要有无参数的构造函
动态加载类
- 编译时刻加载的类是静态加载类
类 c = new 类();
- 运行时刻加载的类是动态加载类
Class c = Class.forName("类的全称");
c.newInstance();
获取方法信息
c.getName();//打印类的全称
c.getSimpleName();//打印类的名称(不包含包名)
//获取所有public方法(包括父类中的)
Method[] ms = c.getMethods();
//获取该类自己声明的方法不限制访问权限
Method[] ms = c.getDeclaredMethods();
//得到方法的返回值类型的类类型
Class returnType = m.getReturnType();
//得到方法的名称
System.out.println(m.getName());
//获取参数类型,得到参数列表的类型的类类型
Class[] paramTypes = m.getParameterTypes();
获取成员变量的信息
java.lang.reflect.Field类
该类封装了关于成员变量的操作
//获取所有public的成员变量的信息
Field[] fs = c.getFields();
//获取所有类中自定义的成员变量的信息
Field[] fs = c.getDeclaredFields();
方法反射的基本操作
如何获取某个方法?
方法的名称和参数列表唯一决定一个方法
//获取public中的方法
c.getMethod(name, parameterTypes);
//获取类中自定义的方法
c.getDeclaredMethod(name, parameterTypes);
//例子
Method m = c.getMethod("print", new Class[]{int.class,int.class});//会抛出异常
//也可以不用数组,直接有几个参数写几个参数
Method m = c.getMethod("print",int.class,int.class);
//用m来调用方法,obj是那个对象来调用这个方法,args是调用时用的参数,有几个写几个,或者用数组,和上面一样
m.invoke(obj, args);
java集合泛型
java中集合的泛型是防止错误输入用的,只会在编译阶段有效,可以用反射的方法绕过编译,可以在集合中添加不符合集合定义时泛型的数据。
无论定义了什么类型的泛型集合,编译之后都是一样的,也就是说,他们的类类型是完全一样的。
网友评论