java中的反射问题 .

来源:互联网 发布:路由器访客网络连不上 编辑:程序博客网 时间:2024/04/28 00:04
  1. package com.refect.demo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Product implements Serializable{  
  6.    
  7.  public String productName;  
  8.  protected String productNo;  
  9.  private double price;  
  10.    
  11.  public Product(){}  
  12.    
  13.  public Product(String productName,String productNo,double price){  
  14.   this.productName = productName;  
  15.   this.productNo = productNo;  
  16.   this.price = price;  
  17.  }  
  18.   
  19.  public String getProductName() {  
  20.   return productName;  
  21.  }  
  22.   
  23.  public void setProductName(String productName) {  
  24.   this.productName = productName;  
  25.  }  
  26.   
  27.  public String getProductNo() {  
  28.   return productNo;  
  29.  }  
  30.   
  31.  public void setProductNo(String productNo) {  
  32.   this.productNo = productNo;  
  33.  }  
  34.   
  35.  public double getPrice() {  
  36.   return price;  
  37.  }  
  38.   
  39.  public void setPrice(double price) {  
  40.   this.price = price;  
  41.  }  
  42.    
  43.  public String toString(){  
  44.   return productName+":"+productNo+":"+price;  
  45.  }  
  46.    
  47. }  
  48.   
  49.    
  50.   
  51. ****************************************************************************************************  
  52.   
  53.    
  54.   
  55. package com.refect.demo;  
  56.   
  57. import java.lang.reflect.Constructor;  
  58. import java.lang.reflect.Field;  
  59. import java.lang.reflect.InvocationTargetException;  
  60. import java.lang.reflect.Method;  
  61. import java.lang.reflect.Modifier;  
  62.   
  63. public class Test {  
  64.   
  65.    
  66.  public static void main(String[] args) {  
  67.   //1.基本数据类型   
  68.   //Class cls1 = int.class;   
  69.   //2.引用数据类型   
  70.   //Class cls2 = Product.class;   
  71.   Class cls2 = null;  
  72.   try {  
  73.    cls2 = Class.forName("com.refect.demo.Product");  
  74.   } catch (ClassNotFoundException e1) {  
  75.    e1.printStackTrace();  
  76.   }  
  77. //  Product p = new Product("杯具","bj0010",20.8);  
  78. //  Object p = null;   
  79. //  try {   
  80. //   调用该类型中的无参的构造函数   
  81. //   p = cls2.newInstance();   
  82. //  } catch (InstantiationException e1) {   
  83. //   e1.printStackTrace();   
  84. //  } catch (IllegalAccessException e1) {   
  85. //   e1.printStackTrace();   
  86. //  }   
  87.   //Product p = new Product();  
  88.   //Class cls = p.getClass();   
  89.     
  90.     
  91.   //类名   
  92.   System.out.println("类路径:"+cls2.getName());  
  93.   System.out.println("类名:"+cls2.getSimpleName());  
  94.     
  95.   //本类定义的所有的属性,但是不包含父类属性   
  96.   Field[] fs = cls2.getDeclaredFields();  
  97.   //返回本类以及父类所有的公共的属性   
  98.   //Field[] fs = cls2.getFields();   
  99.   //指定获取本类定义的属性   
  100.   //Field f = cls2.getDeclaredField("productName");  
  101.   //指定获取本类及父类公有的属性   
  102.   //Field f = cls2.getField("productName");  
  103.   for(Field f : fs){  
  104.    System.out.println("属性访问修饰符:"+Modifier.toString(f.getModifiers()));  
  105.    System.out.println("属性数据类型:"+f.getType());  
  106.    System.out.println("属性名:"+f.getName());  
  107. //   f.setAccessible(true);   
  108. //   try{   
  109. //    if(f.getName().equals("price")){  
  110. //     f.set(p,26.8);   
  111. //    }   
  112. //   System.out.println("属性值:"+f.get(p));   
  113. //   } catch (IllegalArgumentException e) {  
  114. //    e.printStackTrace();   
  115. //   } catch (IllegalAccessException e) {  
  116. //    e.printStackTrace();   
  117. //   }   
  118.   }  
  119.     
  120.     
  121.   //本类定义的所有的方法,但是不包含父类方法   
  122.   Method[] ms = cls2.getDeclaredMethods();  
  123.     
  124.   //Method[] ms = cls2.getMethods();   
  125.     
  126.   for(Method m : ms){  
  127.    System.out.println("方法的访问修饰符:"+Modifier.toString(m.getModifiers()));  
  128.    System.out.println("方法的返回值类型:"+m.getReturnType());  
  129.    System.out.println("方法名称:"+m.getName());  
  130.    System.out.println("参数类型:"+m.getParameterTypes());  
  131.   }  
  132.     
  133. //  try {   
  134. //   Method m1 = cls2.getDeclaredMethod("setPrice", new Class[]{double.class});  
  135. //   m1.invoke(p, new Object[]{38.2});  
  136. //   Method m2 = cls2.getDeclaredMethod("getPrice", null);  
  137. //   Object res = m2.invoke(p, null);  
  138. //   System.out.println(res);   
  139. //  } catch (NoSuchMethodException e) {  
  140. //   e.printStackTrace();   
  141. //  } catch (SecurityException e) {  
  142. //   e.printStackTrace();   
  143. //  } catch (IllegalAccessException e) {  
  144. //   e.printStackTrace();   
  145. //  } catch (IllegalArgumentException e) {  
  146. //   e.printStackTrace();   
  147. //  } catch (InvocationTargetException e) {  
  148. //   e.printStackTrace();   
  149. //  }   
  150.      
  151.     
  152.   Constructor[] cons = cls2.getConstructors();  
  153.   for(Constructor c : cons){  
  154.    System.out.println("构造函数的访问修饰符:"+Modifier.toString(c.getModifiers()));  
  155.    System.out.println("构造函数的方法名:"+c.getName());  
  156.    for(Class pc : c.getParameterTypes()){  
  157.     System.out.println("构造函数的参数:"+ pc);  
  158.    }  
  159.   }  
  160.   
  161.   try {  
  162.    Constructor c = cls2.getConstructor(new Class[]{String.class,String.class,double.class});  
  163.    Object o = c.newInstance(new Object[]{"洗具","盆",5.00});  
  164.    System.out.println(o);  
  165.   } catch (NoSuchMethodException e) {  
  166.    e.printStackTrace();  
  167.   } catch (SecurityException e) {  
  168.    e.printStackTrace();  
  169.   } catch (InstantiationException e) {  
  170.    e.printStackTrace();  
  171.   } catch (IllegalAccessException e) {  
  172.    e.printStackTrace();  
  173.   } catch (IllegalArgumentException e) {  
  174.    e.printStackTrace();  
  175.   } catch (InvocationTargetException e) {  
  176.    e.printStackTrace();  
  177.   }  
  178.     
  179.   //获取父类信息   
  180.   Class sc = cls2.getSuperclass();  
  181.   System.out.println("父类名称:"+sc.getName());  
  182.     
  183.   //实现接口的信息   
  184.   Class[] ic = cls2.getInterfaces();  
  185.   for(Class i : ic){  
  186.    System.out.println("接口名称:"+i.getName());  
  187.   }  
  188.     
  189.   //包信息   
  190.   Package p = cls2.getPackage();  
  191.   System.out.println("包名称:"+p.getName());  
  192.  }  
  193.    
  194.   
  195. }  
  196.