1. package cd.itcast.day1;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4.   
  5. /** 
  6.  * 反射:就是得到类型的描述实例 
  7.  *  
  8.  * @author Administrator 
  9.  *  
  10.  * 练习: 
  11.  * ReflectDemo cd.itcast.day1.User 
  12.  * 任意传入一个类型,解析这个类型的结构 
  13.  *  
  14.  * 1,Class c=Class.forName(args[0]); 
  15.  * 2,getPackage(); 
  16.  * 3,getSimpleName(); 
  17.  * 4,getDeclearFields(); 
  18.  * 5,getDeclareConstrcutors(); 
  19.  * 6,getDeclareMethods(); 
  20.  */  
  21. public class ReflectDemo {  
  22.     public static void main(String[] args) throws Exception {  
  23.         /** 
  24.          * Class:是所有类(接口)的描述 得到一个类型的描述有三种方式 1,通过类型.class得到 2,通过类型的实例得到 
  25.          * 3,通过类的全限定名得到类型 
  26.          *  
  27.          * 直接使用类型.class没有执行类的静态代码快 
  28.          */  
  29.         // Class c=User.class;  
  30.         // System.out.println(c);  
  31.   
  32.         // User u=new User();  
  33.         // Class c=u.getClass();  
  34.         // System.out.println(c);  
  35.         Class<?> c = Class.forName("cd.itcast.day1.User");  
  36.         // test(c);  
  37.         // test2();  
  38.         /** 
  39.          * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
  40.          * 在反射里面,得到构造方法,方法,字段都有两对方法, getXXX:代表的这个类上面能得到的所有的(包括从父类继承的)public的XXX 
  41.          * getDeclaredXXX:代表的是这个类里面自己声明的所有的 XXX 
  42.          *  
  43.          */  
  44.         // test3(c);  
  45.         test4(c);  
  46.           
  47.         System.out.println(c.getName());  
  48.         System.out.println(c.getSimpleName());  
  49.           
  50.         Class c2=User.class;  
  51.         /** 
  52.          * 判断给定的类是否是当前类的子类 
  53.          * 给定的类:参数中的类 
  54.          * 当前的类:调用isAssignableFrom方法的类 
  55.          */  
  56.         System.out.println(c2.isAssignableFrom(Employee.class));  
  57.           
  58.         System.out.println(c2.newInstance());  
  59.           
  60.         Class c3=Domain.class;  
  61.         Constructor con=c3.getDeclaredConstructors()[0];  
  62.         con.setAccessible(true);  
  63.         System.out.println(con.newInstance());  
  64.     }  
  65.   
  66.     /** 
  67.      * 方法 
  68.      */  
  69.     private static void test4(Class<?> c) throws Exception {  
  70.         Method[] ms=c.getDeclaredMethods();  
  71.         System.out.println(Arrays.toString(ms));  
  72.           
  73.         Method m=c.getDeclaredMethod("getName");  
  74.         System.out.println(m);  
  75.           
  76.         Method setter=c.getDeclaredMethod("setName",String.class);  
  77.           
  78.         User u=new User();  
  79.         setter.invoke(u, "xxx");  
  80.           
  81.         String s=(String)m.invoke(u);  
  82.         System.out.println(s);  
  83.           
  84.         Method staticm=c.getDeclaredMethod("getDefaultName");  
  85.         System.out.println(staticm);  
  86.           
  87.         //执行静态方法  
  88.         String ret=(String)staticm.invoke(null);  
  89.         System.out.println(ret);  
  90.     }  
  91.   
  92.     /** 
  93.      * 得到字段 
  94.      *  
  95.      * @param c 
  96.      * @throws Exception 
  97.      */  
  98.     private static void test3(Class<?> c) throws Exception {  
  99.         Field[] fs = c.getFields();  
  100.         System.out.println(Arrays.toString(fs));  
  101.   
  102.         User u = new User();  
  103.   
  104.         Field f = c.getDeclaredField("name");  
  105.         /** 
  106.          * 获取私有字段赋值权限.私有字段不能直接赋值,需要调用setAccessible方法. 
  107.          */  
  108.         f.setAccessible(true);  
  109.         f.set(u, "aaaa");  
  110.   
  111.         System.out.println(u.getName());  
  112.     }  
  113.   
  114.     private static void test2() throws Exception {  
  115.         Class<User> uc = User.class;  
  116.         Constructor<User> c = uc.getConstructor();  
  117.         User u = c.newInstance();  
  118.         System.out.println(u);  
  119.     }  
  120.   
  121.     private static void test(Class<?> c) throws Exception {  
  122.         // 得到类的所有构造器  
  123.         Constructor<?>[] cs = c.getConstructors();  
  124.         System.out.println(Arrays.toString(cs));  
  125.         // 报错:NoSuchMethodException  
  126.         Constructor<?> cc = c.getConstructor(Long.class, String.class);  
  127.         System.out.println(cc);  
  128.   
  129.         /** 
  130.          * Constructor用来描述构造方法的类型 
  131.          */  
  132.         int i = cc.getModifiers();  
  133.         System.out.println(i);  
  134.   
  135.         System.out.println(cc.getName());  
  136.   
  137.         // 得到参数的类型列表  
  138.         System.out.println(Arrays.toString(cc.getParameterTypes()));  
  139.   
  140.         // 使用构造方法创建这个类的实例  
  141.         Object o = cc.newInstance(20l, "abc");  
  142.         User u = (User) o;  
  143.         System.out.println(u.getName());  
  144.     }  
  145. }  
 
posted on 2015-07-30 20:29  小光zfg  阅读(102)  评论(0)    收藏  举报