0、任何一个类都是Class的实例对象,这个实例对象有三种表示方式:
1、Class c1 = Foo.class;//------->实际上告诉我们任何一个类都有一个隐含的静态成员变量;
2、Class c2 = foo1.getClass();//已知该类的对象.c1 c2表示foo类类型的实例。类也是对象,是Class的对象。
3、Class c3 = null;
try{
c3 = Class.forName("com.imooc.reflect.Foo");//通过类的类类型(Class)创建对象
}catch(ClassNotFoundException e){
e.printStackTrace();
}
1、编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。
2、new创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类。
3、例如new了两个不同类型的对象,但其中的一个类类型不存在,则那个存在类类型的对象也用不了,动态加载类可以解决该问题。
public static void main(String[] args){
try{
Class c = Class.forName(args[0]);//动态加载类,在运行时刻加载类
InterfaceName classname = (Interface) c.newInstance();//通过类类型,创建对象
}
catch()
4、基本数据类型的类类型
Class c1 = int.class;
Class c2 = Integer.class
Class c3 = void.class;
system.out.print(c1.getName(c1));
5、一个成员方法就是一个Method对象
Method [] ms = c1.getMethods();//获取的是所有public函数,包括父类继承而来的。
Method [] ms = c1.getDeclaredMethods();//获取的是所有该类自己声明的方法,不问访问权限。
6、类的成员变量也是对象,是属于java.lang.reflect.Field 封装了关于成员变量的操作 getFields()方法获取的是所有的public的成员变量的信息
getDeclaredFields获取的是该类自己声明的成员变量的信息。
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);
}
7、类的构造函数
下面的方法就是为了obj对象得到构造函数的信息:
public static void printConMessage(Object obj){
Class c = obj.getClass();
//构造函数也是对象,java.lang.Constructor中封装了构造函数的信息 getConsructors获取所有的public的构造函数 getDeclaredConstructors得到所有的构造哈数
Constructor [] cs = c.getDeclaredConstructors();
for(Constructor constuctor : cs){
System.out.println(constructor.getName()+"(");//获取构造函数的名字
Class[] paramTypes = constructor.getParameterTypes();
for(Class class1 : paramTypes){
System.out.println (class1.getName());
}
}
}
8、java中集合的泛型是防止错误输入的,只在编译阶段有效,编译之后就没有泛型存在了。我们可以通过方法的反射来操作,绕过编译。