Chinaunix首页 | 论坛 | 博客
  • 博客访问: 362008
  • 博文数量: 97
  • 博客积分: 2030
  • 博客等级: 大尉
  • 技术积分: 763
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-12 09:11
文章分类

全部博文(97)

文章存档

2020年(1)

2019年(1)

2018年(4)

2017年(16)

2016年(61)

2015年(1)

2013年(3)

2006年(10)

我的朋友

分类: Java

2016-05-17 13:24:46

本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。

下面开始正文。

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的返回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

 

 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

 

 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

  


【案例1】通过一个对象获得完整的包名和类名

  1. package Reflect;
  2.  
  3. /**
  4.  * 通过一个对象获得完整的包名和类名
  5.  * */
  6. class Demo{
  7.     //other codes...
  8. }
  9.  
  10. class hello{
  11.     public static void main(String[] args) {
  12.         Demo demo=new Demo();
  13.         System.out.println(demo.getClass().getName());
  14.     }
  15. }
【运行结果】:Reflect.Demo

【案例2】实例化类对象

  1. package Reflect;
  2. class Demo{
  3.     //other codes...
  4. }
  5.  
  6. class hello{
  7.     public static void main(String[] args) {
  8.         Class<?> demo1=null;
  9.         Class<?> demo2=null;
  10.         Class<?> demo3=null;
  11.         try{
  12.             //一般尽量采用这种形式
  13.             demo1=Class.forName("Reflect.Demo");
  14.         }catch(Exception e){
  15.             e.printStackTrace();
  16.         }
  17.         demo2=new Demo().getClass();
  18.         demo3=Demo.class;
  19.          
  20.         System.out.println("类名称 "+demo1.getName());
  21.         System.out.println("类名称 "+demo2.getName());
  22.         System.out.println("类名称 "+demo3.getName());
  23.          
  24.     }
  25. }



【运行结果】:

类名称   Reflect.Demo

类名称   Reflect.Demo

类名称   Reflect.Demo


【案例3】实例化类对象

通过无参构造实例化对象
 
  1. class Person {

  2.     public Person() {
  3.         this("", 0);
  4.     }

  5.     public Person(String name, int age) {
  6.         this.name = name;
  7.         this.age = age;
  8.     }

  9.     public String getName() {
  10.         return name;
  11.     }

  12.     public void setName(String name) {
  13.         this.name = name;
  14.     }

  15.     public int getAge() {
  16.         return age;
  17.     }

  18.     public void setAge(int age) {
  19.         this.age = age;
  20.     }

  21.     @Override
  22.     public String toString() {
  23.         return "[" + this.name + " " + this.age + "]";
  24.     }

  25.     private String name;
  26.     private int age;
  27. }

  1. public class Demo1 {

  2.     /**
  3.      * @param args
  4.      */
  5.     public static void main(String[] args) {
  6.          Class<?> demo=null;
  7.      try{
  8.      demo=Class.forName("com.elements.Reflect.Person");
  9.      }catch (Exception e) {
  10.      e.printStackTrace();
  11.      }
  12.      Person per=null;
  13.      try {
  14.      per=(Person)demo.newInstance();
  15.      } catch (InstantiationException e) {
  16.      // TODO Auto-generated catch block
  17.      e.printStackTrace();
  18.      } catch (IllegalAccessException e) {
  19.      // TODO Auto-generated catch block
  20.      e.printStackTrace();
  21.      }
  22.      per.setName("Rollen");
  23.      per.setAge(20);
  24.      System.out.println(per);

  25.     }

  26. }

【运行结果】:

 [Rollen  20]

通过带参构造实例化对象

  1.     demo=Class.forName("com.elements.Reflect.Person");
  2.      //取得全部的构造函数
  3.      Constructor<?> cons[]=demo.getConstructors();
  4.      Person per=null;
  5.      //调用哪个构造函数实例化对象
  6.      per=(Person)cons[1].newInstance("Rollen",20);
  7.      System.out.println(per);
 Constructor类的主要属性

  1.     private Class<T> clazz;//对象类
  2.     private int slot;
  3.     private Class<?>[] parameterTypes;//这里保存了构造函数的参数类型,比较重要
  4.     private Class<?>[] exceptionTypes;
  5.     private int modifiers;
  6.     // Generics and annotations support
  7.     private transient String signature;
  8.     // generic info repository; lazily initialized
  9.     private transient ConstructorRepository genericInfo;
  10.     private byte[] annotations;
  11.     private byte[] parameterAnnotations;

【案例4】返回一个类实现的接口


  1. //保存所有的接口
  2.         Class<?> intes[]=demo.getInterfaces();
  3.         for (int i = 0; i < intes.length; i++) {
  4.             System.out.println("实现的接口 "+intes[i].getName());
  5.         }

输出
实现的接口   com.elements.Reflect.China

【案例5】获取类的属性


  1.      demo=Class.forName("com.elements.Reflect.Person");
  2.      //取得全部的构造函数
  3.      Class<?> intes[]=demo.getInterfaces();
  4.     
  5.      System.out.println("===============本类属性========================");
  6.      // 取得本类的全部属性
  7.      Field[] field = demo.getDeclaredFields();
  8.      for (int i = 0; i < field.length; i++) {
  9.      // 权限修饰符
  10.      int mo = field[i].getModifiers();
  11.      String priv = Modifier.toString(mo);
  12.      // 属性类型
  13.      Class<?> type = field[i].getType();
  14.      System.out.println(priv + " " + type.getName() + " "
  15.      + field[i].getName() + ";");
  16.      }
  17.      System.out.println("===============实现的接口或者父类的属性========================");
  18.      // 取得实现的接口或者父类的属性
  19.      Field[] filed1 = demo.getFields();
  20.      for (int j = 0; j < filed1.length; j++) {
  21.      // 权限修饰符
  22.      int mo = filed1[j].getModifiers();
  23.      String priv = Modifier.toString(mo);
  24.      // 属性类型
  25.      Class<?> type = filed1[j].getType();
  26.      System.out.println(priv + " " + type.getName() + " "
  27.      + filed1[j].getName() + ";");
  28.      }
输出
===============本类属性========================
private java.lang.String name;
private int age;
===============实现的接口或者父类的属性========================
public static final java.lang.String name;
public static final int age;

【案例5】获取类的方法


  1.     demo=Class.forName("com.elements.Reflect.Person");
  2.      //取得全部的接口
  3.      Class<?> intes[]=demo.getInterfaces();
  4.     
  5.      System.out.println("===============本类方法========================");
  6.      // 取得本类的本类方法
  7.     
  8.      Method[] method = demo.getDeclaredMethods();
  9.      for (int i = 0; i < method.length; i++) {
  10.      // 权限修饰符
  11.      int mo = method[i].getModifiers();
  12.      String priv = Modifier.toString(mo);
  13.      // 返回的类型
  14.      Class<?> type = method[i].getReturnType();
  15.     
  16.      //获取参数
  17.      Parameter[] parms= method[i].getParameters();
  18.     
  19.      String stringprams="";
  20.      for (int p = 0; p < parms.length; p++) {
  21.          stringprams=stringprams+ parms[p].getParameterizedType()+",";
  22.      }
  23.      if (stringprams.length()>1)
  24.      stringprams=stringprams.substring(0, stringprams.length()-1);
  25.     
  26.      System.out.println(priv + " " + type.getName() + " "
  27.              +method[i].getName()+"("+stringprams+")" );
  28.      }
输出

===============本类方法========================
public java.lang.String toString()
public java.lang.String getName()
public void setName(class java.lang.String)
public void sayChina()
public int getAge()
public void setAge(int)
public void sayHello(class java.lang.String,int)


【案例6】调用类的方法


  1.      demo=Class.forName("com.elements.Reflect.Person");
  2.      Object o=demo.newInstance();
  3.     
  4.      //调用Person类中的sayChina方法
  5.      Method method=demo.getMethod("sayChina");
  6.      method.invoke(demo.newInstance());
  7.     
  8.      //调用setName 带参数
  9.      Method method2=demo.getMethod("setName",String.class);
  10.      method2.invoke(o,"aaaa");
  11.      System.out.print(o);
  12.      //以下代码实现一样
  13. //            Person p=(Person) demo.newInstance();
    //            p.setName("aaaa");        
    //            System.out.print(p);


【案例7】调用类的get和set方法


  1. public static void getter(Object obj, String att) {
  2.      try {
  3.      Method method = obj.getClass().getMethod("get" + att);
  4.      System.out.println(method.invoke(obj));
  5.      } catch (Exception e) {
  6.      e.printStackTrace();
  7.      }
  8.      }
  9.     
  10.     
  11.      public static void setter(Object obj, String att, Object value,
  12.      Class<?> type) {
  13.      try {
  14.      Method method = obj.getClass().getMethod("set" + att, type);
  15.      method.invoke(obj, value);
  16.      } catch (Exception e) {
  17.      e.printStackTrace();
  18.      }
  19.      }
  20.     

  21.     /**
  22.      * @param args
  23.      */
  24.     public static void main(String[] args) {
  25.         Class<?> demo = null;
  26.         Object obj=null;
  27.         try {
  28.             demo = Class.forName("com.elements.Reflect.Person");
  29.         } catch (Exception e) {
  30.             e.printStackTrace();
  31.         }
  32.         try{
  33.          obj=demo.newInstance();
  34.         }catch (Exception e) {
  35.             e.printStackTrace();
  36.         }
  37.         setter(obj,"Sex","男",String.class);
  38.         getter(obj,"Sex");
  39.     

  40.     }

【案例8】通过反射修改属性值


  1.         Class<?> demo = null;
  2.         Object obj = null;
  3.  
  4.         demo = Class.forName("Reflect.Person");
  5.         obj = demo.newInstance();
  6.  
  7.         Field field = demo.getDeclaredField("sex");
  8.         field.setAccessible(true);
  9.         field.set(obj, "男");
  10.         System.out.println(field.get(obj));


 
阅读(949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~