A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 年轻的棒棒 中级黑马   /  2013-5-25 11:44  /  1916 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 年轻的棒棒 于 2013-5-26 10:42 编辑

通过一个对象获得完整的包名和类名
  1. package reflect;
  2. class Demo{
  3.     //other codes...
  4. }
  5. public class Hello{
  6.     public static void main(String[] args) {
  7.         Demo demo=new Demo();
  8.         System.out.println(demo.getClass().getName());
  9.     }
  10. }
复制代码
实例化Class类对象
  1. package reflect;
  2. import reflect.Demo;
  3. class Hello1{
  4.     public static void main(String[] args) {
  5.         Class<?> demo1=null;
  6.         Class<?> demo2=null;
  7.         Class<?> demo3=null;
  8.         try{
  9.             //一般尽量采用这种形式
  10.             demo1=Class.forName("reflect.Demo");
  11.         }catch(Exception e){
  12.             e.printStackTrace();
  13.         }
  14.         demo2=new Demo().getClass();
  15.         demo3=Demo.class;         
  16.         System.out.println("类名称   "+demo1.getName());
  17.         System.out.println("类名称   "+demo2.getName());
  18.         System.out.println("类名称   "+demo3.getName());        
  19.     }
  20. }</font>
复制代码
当我们把Person
中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后。会出现错误
  1. package reflect;
  2. class Person{
  3.         public Person(String name,int age){
  4.                 this.age=age;
  5.                 this.name=name;
  6.         };
  7.     public String getName() {
  8.         return name;
  9.     }
  10.     public void setName(String name) {
  11.         this.name = name;
  12.     }
  13.     public int getAge() {
  14.         return age;
  15.     }
  16.     public void setAge(int age) {
  17.         this.age = age;
  18.     }
  19.     @Override
  20.     public String toString(){
  21.         return"["+this.name+"  "+this.age+"]";
  22.     }
  23.     private String name;
  24.     private int age;
  25. }

  26. class Hello3{
  27.     public static void main(String[] args) {
  28.         Class<?> demo=null;
  29.         try{
  30.             demo=Class.forName("reflect.Person");
  31.         }catch(Exception e) {
  32.             e.printStackTrace();
  33.         }
  34.         Person per=null;
  35.         try{
  36.             per=(Person)demo.newInstance();
  37.         }catch(InstantiationException e) {
  38.             // TODO Auto-generated catch block
  39.             e.printStackTrace();
  40.         }catch(IllegalAccessException e) {
  41.             // TODO Auto-generated catch block
  42.             e.printStackTrace();
  43.         }
  44.         per.setName("Rollen");
  45.         per.setAge(20);
  46.         System.out.println(per);
  47.     }
  48. }
复制代码
所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数

获得其他类中的全部构造函数
  1. package reflect;

  2. import java.lang.reflect.*;
  3. interface China{
  4.         public static final String name="Rollen";
  5.     public static  int age=20;
  6.     public void sayChina();
  7.     public void sayHello(String name,int age);
  8. }
  9. class Person1 implements China{
  10.     public Person1() {
  11.          
  12.     }
  13.     public Person1(String sex){
  14.         this.sex=sex;
  15.     }
  16.     public String getSex() {
  17.         return sex;
  18.     }
  19.     public void setSex(String sex) {
  20.         this.sex = sex;
  21.     }
  22.     @Override
  23.     public void sayChina(){
  24.         System.out.println("hello ,china");
  25.     }
  26.     @Override
  27.     public void sayHello(String name,int age){
  28.         System.out.println(name+"  "+age);
  29.     }
  30.     private String sex;
  31. }

  32. class Hello4{
  33.     public static void main(String[] args) {
  34.         Class<?> demo=null;
  35.         try{
  36.             demo=Class.forName("reflect.Person1");
  37.         }catch(Exception e) {
  38.             e.printStackTrace();
  39.         }
  40.         Constructor<?>cons[]=demo.getConstructors();
  41.         for(int i =0; i < cons.length; i++) {
  42.             Class<?> p[]=cons[i].getParameterTypes();
  43.             System.out.print("构造方法:  ");
  44.             int mo=cons[i].getModifiers();
  45.             System.out.print(Modifier.toString(mo)+" ");
  46.             System.out.print(cons[i].getName());
  47.             System.out.print("(");
  48.             for(int j=0;j<p.length;++j){
  49.                 System.out.print(p[j].getName()+" arg"+i);
  50.                 if(j<p.length-1){
  51.                     System.out.print(",");
  52.                 }
  53.             }
  54.             System.out.println("){}");
  55.         }
  56.     }
  57. }
复制代码
取得其他类的全部属性
  1. package reflect;
  2. import java.lang.reflect.*;
  3. class Hello6{
  4.     public static void main(String[] args) {
  5.         Class<?> demo =null;
  6.         try{
  7.             demo = Class.forName("reflect.Person1");
  8.         }catch(Exception e) {
  9.             e.printStackTrace();
  10.         }
  11.         System.out.println("===============本类属性========================");
  12.         // 取得本类的全部属性
  13.         Field[] field = demo.getDeclaredFields();
  14.         for(int i =0; i < field.length; i++) {
  15.             // 权限修饰符
  16.             int mo = field[i].getModifiers();
  17.             String priv = Modifier.toString(mo);
  18.             // 属性类型
  19.             Class<?> type = field[i].getType();
  20.             System.out.println(priv +" "+ type.getName() +" "
  21.                     + field[i].getName() +";");
  22.         }
  23.         System.out.println("===============实现的接口或者父类的属性========================");
  24.         // 取得实现的接口或者父类的属性
  25.         Field[] filed1 = demo.getFields();
  26.         for(int j =0; j < filed1.length; j++) {
  27.             // 权限修饰符
  28.             int mo = filed1[j].getModifiers();
  29.             String priv = Modifier.toString(mo);
  30.             // 属性类型
  31.             Class<?> type = filed1[j].getType();
  32.             System.out.println(priv +" "+ type.getName() +" "
  33.                     + filed1[j].getName() +";");
  34.         }
  35.     }
  36. }
复制代码
通过反射修改数组大小
  1. package reflect;
  2. import java.lang.reflect.*;
  3. class Hello7{
  4.     public static void main(String[] args) {
  5.         int[] temp={1,2,3,4,5,6,7,8,9};
  6.         int[] newTemp=(int[])arrayInc(temp,15);
  7.         print(newTemp);
  8.         System.out.println("=====================");
  9.         String[] atr={"a","b","c"};
  10.         String[] str1=(String[])arrayInc(atr,8);
  11.         print(str1);
  12.     }
  13.      
  14.     /**
  15.      * 修改数组大小
  16.      * */
  17.     public static Object arrayInc(Object obj,int len){
  18.         Class<?>arr=obj.getClass().getComponentType();
  19.         Object newArr=Array.newInstance(arr, len);
  20.         int co=Array.getLength(obj);
  21.         System.arraycopy(obj,0, newArr,0, co);
  22.         return newArr;
  23.     }
  24.     /**
  25.      * 打印
  26.      * */
  27.     public static void print(Object obj){
  28.         Class<?>c=obj.getClass();
  29.         if(!c.isArray()){
  30.             return;
  31.         }
  32.         System.out.println("数组长度为: "+Array.getLength(obj));
  33.         for(int i =0; i < Array.getLength(obj); i++) {
  34.             System.out.print(Array.get(obj, i)+" ");
  35.         }
  36.     }
  37. }
复制代码
有时候取得方法时会有一些异常
  1. package reflect;
  2. import java.lang.reflect.*;
  3. class Hello5{
  4.     public static void main(String[] args) {
  5.         Class<?> demo=null;
  6.         try{
  7.             demo=Class.forName("reflect.Person1");
  8.         }catch(Exception e) {
  9.             e.printStackTrace();
  10.         }
  11.         Method method[]=demo.getMethods();
  12.         for(int i=0;i<method.length;++i){
  13.             Class<?> returnType=method[i].getReturnType();
  14.             Class<?> para[]=method[i].getParameterTypes();
  15.             int temp=method[i].getModifiers();
  16.             System.out.print(Modifier.toString(temp)+" ");
  17.             System.out.print(returnType.getName()+"  ");
  18.             System.out.print(method[i].getName()+" ");
  19.             System.out.print("(");
  20.             for(int j=0;j<para.length;++j){
  21.                 System.out.print(para[j].getName()+" "+"arg"+j);
  22.                 if(j<para.length-1){
  23.                     System.out.print(",");
  24.                 }
  25.             }
  26.             Class<?> exce[]=method[i].getExceptionTypes();
  27.             if(exce.length>0){
  28.                 System.out.print(") throws ");
  29.                 for(int k=0;k<exce.length;++k){
  30.                     System.out.print(exce[k].getName()+" ");
  31.                     if(k<exce.length-1){
  32.                         System.out.print(",");
  33.                     }
  34.                 }
  35.             }else{
  36.                 System.out.print(")");
  37.             }
  38.             System.out.println();
  39.         }
  40.     }
  41. }
复制代码
结果如下
  1. public java.lang.String  getSex ()
  2. public void  setSex (java.lang.String arg0)
  3. public void  sayChina ()
  4. public void  sayHello (java.lang.String arg0,int arg1)
  5. public final native java.lang.Class  getClass ()
  6. public native int  hashCode ()
  7. public boolean  equals (java.lang.Object arg0)
  8. public java.lang.String  toString ()
  9. public final native void  notify ()
  10. public final native void  notifyAll ()
  11. public final void  wait () throws java.lang.InterruptedException
  12. public final void  wait (long arg0,int arg1) throws java.lang.InterruptedException
  13. public final native void  wait (long arg0) throws java.lang.InterruptedException
复制代码

评分

参与人数 1技术分 +2 收起 理由
曹睿翔 + 2 很好!

查看全部评分

2 个回复

倒序浏览
努力 。 加油啦 。。   
回复 使用道具 举报
再排一下版,反射这块知识挺多的,能不能再扩展点?弄好了在任务帖回复
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马