1、Class类的使用
java语言中,静态的成员和普通数据类型不是对象
类是对象,是java.lang.Class类的实例对象
任何一种类都是Class的实例对象,这个实例对象有三种表示1、Class c1=foo.class;2、Class c2=foo1.getClass();//已知该类的对象通过getClass方法3、Class c3=null;c3=Class.forName(“类全名称”);
Foo foo=(Foo)c1.newInstance();
2、动态加载类
Class.forName(“类全名称”)不仅代表了类的类类型,还代表了动态加载类区分编译、运行编译时刻加载类是静态加载类,运行时刻加载类是动态加载类(new创建的对象是静态加载类,在编译时刻就加载所有可能用到的类)功能性的类使用动态加载
3、获取方法的信息
获取类的类类型 Class c=object.getClass();//传递哪个子类的对象,c就是该子类的类类型
Method[] ms=c.getMathod();//获取的是所有的public函数,包括父类继承过来的//getDeclaredMethods()获取的是所有该类自己声明的方法,不管访问权限Class returnType=ms[0].getReturnType();//得到方法的返回值类型的类类型ms[0].getName();//得到方法的名称Class[] paraTypes=ms[0].getParameterTypes();//得到的是参数列表的类型的类类型
4、获取成员变量和构造函数信息
成员变量也是对象
Fields[] fs = c.getFields();//获取的是所有public的成员变量的信息
Fields[] fs = c.getDeclaredFields();//获取的是该类自己声明的成员变量的信息
Class fieldType = field.getType();String typeName = fieldType.getName();//成员变量的类型的类类型String fieldName = field.getName();//得到成员变量名称
构造函数也是对象Class c= obj.getClass();Constructor [] cs = c.getConstructors();//获取所有的public的构造函数Constructor [] cs = c.getDeclaredConstructors();//得到所有声明的构造函数Class[] paramTypes=constructor.getParameterTypes();//得到参数列表的类类型
5、方法反射
方法的名称和方法的参数列表才能唯一确定某个方法
方法的反射操作 method.invoke(对象,参数列表)
1、首先获取类的类类型 A a1 = new A(); Class c= obj.getClass();
2、获取方法 Method m=c.getMathod(“print”,new Class[]{int.class,int.class});
3、方法的反射操作,方法如果没有返回值就返回null Object o = m.invoke(a1,new Object[]{10,20});
ArrayList<String> array = new ArrayList<String>();//泛型只在编译时期起作用,是防止输入错误,而在运行期间是去泛型的,可以通过反射机制来绕开泛型的限制。