java反射reflect

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中集合的泛型是防止错误输入用的,只会在编译阶段有效,可以用反射的方法绕过编译,可以在集合中添加不符合集合定义时泛型的数据。

无论定义了什么类型的泛型集合,编译之后都是一样的,也就是说,他们的类类型是完全一样的。

你可能感兴趣的:(java反射reflect)