Class类的使用
package com.zyz; /** * Created by zyz on 2016-9-22. */ public class ClassDemo1 { public static void main(String[] args){ Foo foo1=new Foo(); //第1种表示法---Foo类也是一个对象,任何一个类都会有一个静态的成员变量class Class c1=Foo.class; // 第2种表示法 Class c2=foo1.getClass(); //c1,c2表示Foo类的类类型(class type) // 万事万物皆对象 // 类也是对象,是Class类的实例对象 // 这个对象我们称之为该类的类类型 System.out.println(c1==c2);//true,c1,c2都代表了Foo类的类类型,一个类只能是Class类的一个实例对象 //第3种表示法 Class c3=null; try { c3 = Class.forName("com.zyz.Foo"); }catch (ClassNotFoundException e){ e.printStackTrace(); } System.out.println(c2==c3);//true //我们可以通过类的类类型创建该类的实例对象,-->通过c1或c2或c3创建Foo类的实例对象 try { Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法 foo.print(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } class Foo{ void print(){ System.out.println("foo"); } }
//--------------静态加载------------------ class Office{ public static void main(String[] args) { if("Word".equals(args[0])){ Word word=new Word(); //new 创建对象是静态加载类,在编译时刻就要加载所有可能用到的类,即无论是传的参数是"Word"还是"Excel",Word和Excel的类型必须创建并编译成Class文件。 word.start(); } if("Excel".equals(args[0])){ Excel excel=new Excel(); excel.start(); } } } //--------------------动态加载,即运行时加载---------------- //定义一个接口 interface OfficeAble { public void start(); } //定义Word类实现接口 class Word implements OfficeAble { public void start(){ System.out.println("word...starts..."); } } //定义Excel类实现接口 class Excel implements OfficeAble { public void start(){ System.out.println("excel...starts..."); } } //改进的Office类 class OfficeBetter{ public static void main(String[] args) { try{ Class c=Class.forName(args[0]);//得到传入的参数得到该类的类类型 OfficeAble oa=(OfficeAble)c.newInstance();//创建该类的对象 oa.start();//调用该类实现的方法 }catch(Exception e){ e.printStackTrace(); } } }
/** * Created by Administrator on 16-9-22. */ public class ClassDemo2 { public static void main(String[] args){ Class c1=int.class; Class c2=String.class; Class c3=double.class; Class c4=Double.class; Class c5=void.class; System.out.println(c1.getName());//int System.out.println(c2.getName());//java.lang.String System.out.println(c2.getSimpleName());//String System.out.println(c3.getName());//double System.out.println(c4.getName());//java.lang.Double System.out.println(c5.getName());//void } }
package com.zyz; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by Administrator on 16-9-22. */ public class ClassUtil { /** * 打印类的方法信息 * @param object 该对象所属类的信息 * */ public static void printMethodMessage(Object object){ //首先要获取类的类类型 Class c=object.getClass();//传递的是哪个子类的对象 System.out.println("类的名称为:"+c.getName()); /* Method类,是方法对象 一个成员方法就是一个Method对象 getMethods方法是获取所有public方法,包括从父类继承过来的方法 getDeclaredMethods获取的是所有该类自己声明的方法,不问访问权限 * */ Method[] ms=c.getMethods(); for(Method m:ms){ /*得到方法的返回值类类型*/ Class returnType=m.getReturnType(); System.out.print(returnType.getName()+" ");//返回值类型名称 System.out.print(m.getName()+"(");//方法名称 //获取参数类型-->得到的是参数列表的类类型 Class[] paramTypes=m.getParameterTypes(); for(Class c1:paramTypes){ System.out.print(c1.getName()+","); } System.out.println(")"); } } /** * 打印成员变量的信息 * @param obj */ public static void printFieldMessage(Object obj) { /** * 成员变量也是对象 * java.lang.reflect.Field * Field类封装了关于成员变量的一些操作 * getFields()是获取所有public成员变量的信息 * getDeclaredFields()是获取该类自己声明的成员变量的信息 */ Class c=obj.getClass(); Field[] fs=c.getDeclaredFields(); for(Field field:fs){ Class fieldType=field.getType();//得到成员变量的类类型,如int.class String typeName=fieldType.getName();//得到类型名 String fieldName=field.getName();//得到变量名 System.out.println(typeName+" "+fieldName); } } /** * 打印构造函数的信息 */ public static void printConMessage(Object obj){ Class c=obj.getClass(); /* 构造函数也是对象 java.lang.Contructor getConstuctors获取所有的public构造函数 getDeclaredConstructors得到所有的构造函数 */ Constructor[] cs=c.getDeclaredConstructors(); for(Constructor constructor:cs){ System.out.print(constructor.getName()+"("); //获取构造函数参数列表--->得到的是参数列表的类类型 Class[] paramTypes=constructor.getParameterTypes(); for(Class c1:paramTypes){ System.out.print(c1.getName()+","); } System.out.println(")"); } } }
package com.zyz; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; /** * Created by Administrator on 16-9-25. */ public class MethodDemo4 { public static void main(String[] args){ ArrayList list=new ArrayList(); ArrayList<String> list1=new ArrayList<String>(); list.add(1); list1.add("hello"); // list1.add(20);不能通过编译阶段 Class c1=list.getClass(); Class c2=list1.getClass(); System.out.println(c1==c2);//true //反射的操作都是编译之后的操作 //c1==c2结果返回true说明编译之后的集合的泛型是去泛型化的。 //java中集合的泛型,是防止错误输入,只在编译阶段有效,绕过编译就无效了。 //我们可以通过方法的反射来操作,绕过编译 Method m= null; try { m = c2.getMethod("add",Object.class); m.invoke(list1,20);//绕过编译操作就绕过了泛型 System.out.println(list1.size());//2 System.out.println(list1);//[hello,20] // for(String str:list1){ // System.out.println(str); // }现在就不能这样遍历了 for(Object obj:list1){ System.out.println(obj); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }