class type

来源:互联网 发布:慕课网python教程 编辑:程序博客网 时间:2024/06/06 19:24

在java里面,所有事物都是对象,class也是Java.lang.class的对象。
获取一个类的class type 有三种方法

  1. 知道类的名字Class c1=ClassName.class
  2. 知道类的实例Class c2=instance.getClass();
  3. Class c3=Class.forName("完整类名")
    一个类只有一个class type c1=c2=c3
    可以通过class type 来创建该类的对象,需要强制转化。
ClassName instance=(ClassName) c1.newInstance();//需要有无参的构造方法

new创建对象是静态加载类,在编译时刻就需要加载所有可能使用到的类。
Class.forName(“类的全称”)不仅表示类的class type,还代表动态加载类。
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。

关于获取类的方法信息

getDeclaredMethod*()获取的是类自身声明的所有方法,包含public、protected和private方法。
getMethod*()获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。

获取类方法的信息

public static void getInfo(Object ob){        Class class1=ob.getClass();        System.out.println("该类的名称是"+class1.getName());        //方法的类型名称等信息        Method[] ms=class1.getMethods();        for(Method m:ms){        System.out.print(m.getReturnType().getName()+" ");        System.out.print(m.getName()+"(");        //打印该方法的入参类型,得到的是一个参数类类型数组        Class[] mi=m.getParameterTypes();        for(Class c1:mi){        System.out.print(c1.getName()+",");        }        System.out.println(")");        }    }```成员变量也是对象,是java.lang.reflect.Field---------------------------------

public static void getFieldsInfo(Object ob) {
Class class1=ob.getClass();
System.out.println(“++++++++++++++++++”);

    Field[] flFields=class1.getFields();    for(Field fl:flFields){        Class nameClass=fl.getType();        System.out.print(nameClass.getName()+" ");        System.out.println(fl.getName());    }
获取构造函数的信息---------

public static void getConstructor(Object b){
//获取一个类的classtype
Class clsClass=b.getClass();
//获得所有的构造函数的数组
Constructor[] cons=clsClass.getConstructors();

    for(Constructor co:cons ){        System.out.print(co.getModifiers()+" "+co.getName()+"(");        Parameter[] pr=co.getParameters();        for(Parameter p:pr){            System.out.print(p.getClass().getName()+","+p.getName());        }        System.out.println(')');    }}

反射来调用方法

方法的唯一标识,返回类型和入参

method.invoke(对象,入参);

通过反射来探究泛型

        ArrayList< String> list1=new ArrayList<String>();        list1.add("Hello");//由于list1增加了泛型,所以无法加入其它类别的数据        ArrayList<Integer> list2=new ArrayList<Integer>();        list2.add(3);        //list1与list2的泛型不一样,一个为String,一个为int,但是        Class c1=list1.getClass();        Class c2=list2.getClass();        System.out.println(c1==c2);//结果为true。编译之后的集合是去泛型化的        //通过运行时执行来绕过编译        Method md=c1.getMethod("add", Object.class);        md.invoke(list1, 235);//现在来为他加入一个int类型的数字        System.out.println(list1.size());//2        System.out.println(list1);//输出hello 235
原创粉丝点击