Java反射研究

 

java.lang.reflect包

Constructor、Field、Method的父类是AccessibleObject;


一、获得Class对象


Class<?> c = Class.forName("classname");   抛出ClassNotFoundException


二、获得实现接口


Class<?> inters[] = c.getInterfaces();

for(int i=0;i<inters.length;i++){

    System.out.print(inters[i].getName()+" ");        //getName()方法为取得接口名称;

}


三、获得父类


Class<?> superClass  = c.getSuperclass();     //获得父类

String name  = superClass.getName();    //获得父类名称


四、取得构造方法


Constructor cons[] = c.getConstructors();         //获得公开的构造方法

Constructor dcons[] = c.getDeclaredConstructors();        //获得全部构造方法

String modifier = Modifier.toString(cons[i].getModifiers());   //获得访问权限

String name = cons[i].getName();            //获得构造方法名称

Class<?> params[] = cons[i].getParameterTypes();        //获得参数类型对象


五、获得Method


Method ms[] = c.getMethods();                        //返回公共的全部方法,包括继承方法

Method dms[] = c.getDeclaredMethods();        //返回本类全部方法,不包括继承的方法

Class<?> rt = ms[i].getReturnType();

Class<?>params[] = ms[i].getParameterTypes();

String name = ms[i].getName();

String modifier = Modifier.toString(ms[i].getModifiers());

Class<?>ex[] = ms[i].getExceptionTypes();        //获得异常

String name = ex[i].getName();            //获得异常名称


六、获得Field


Field fs[] = c.getFields();                    //获得公共属性,包括继承属性

Field dfs[] = c.getDeclaredFields();    // 获得本类全部属性

Class<?> type = fs[i].getType();        //获得属性的类型对象

String name = fs[i].getName();        //获得属性的名称

String modifier = Modifier.toString(fs[i].getModifiers());


七、通过反射创建一个对象


Class<?> c = Class.forName("Person");

Person p = (Person)c.newInstance();


八、Constructor创建对象


Class c = Class.forName("Person");
Constructor<?> cons[] = c.getConstructors();
Person p = (Person)cons[0].newInstance("xiazdong",15);

九、调用特定方法


Method m = c1.getMethod("funcname",Class<?>...c);   //funcname表示调用方法的名称,c表示参数的Class对象

例如:Method m = c1.getMethod("fun",String.class,int.class);    表示调用fun(String,int);函数

m.invoke(c1.newInstance(),"xiazdong",20);   //如果有返回值,则invoke函数返回;


十、调用特定属性


Field f = c1.getDeclaredField("name");    //返回name属性

f.setAccessible(true);    //私有属性可见

f.get(Object obj);   //返回obj对象的name属性的值

f.set(Object obj,String n);      //设置obj对象的name属性为n值;


十一、操作数组


int tmp[] = {1,2,3};

Class<?> c  = tmp.getClass().getComponentType();

Array.getLength(tmp);        //tmp数组的长度

c.getName();           //获得数组类型名称

Array.get(Object obj,int index);      //获得obj数组的index索引的数值

Array.set(Object obj,int index,VALUE);    //设置obj数组的index索引的数值为value;

Object obj  = Array.newInstance(c,length);          //c为数组的类型,length为数组的长度;obj为返回的数组对象;


示例:


  1. import java.lang.reflect.*;  
  2. public class GetMethodDemo01{  
  3.     public static void main(String args[])throws Exception{  
  4.         Class<?> c1 = Class.forName("Person");  
  5.         Method m = c1.getMethod("sayHello");  
  6.         m.invoke(c1.newInstance());  
  7.         Method m2 = c1.getMethod("sayHello2",String.class,int.class);  
  8.         String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);  
  9.         System.out.println(str);  
  10.         Field nameField = c1.getDeclaredField("name");  
  11.         Field ageField = c1.getDeclaredField("age");  
  12.         nameField.setAccessible(true);  
  13.         ageField.setAccessible(true);  
  14.         Person obj = (Person)c1.newInstance();  
  15.         obj.setName("xzdong");  
  16.         obj.setAge(12);  
  17.         System.out.println(nameField.get(obj));  
  18.         System.out.println(ageField.get(obj));  
  19.         Method setName = c1.getMethod("setName",String.class);  
  20.         setName.invoke(obj,"changed");  
  21.         Method getName = c1.getMethod("getName");  
  22.         System.out.println(getName.invoke(obj));  
  23.   
  24.         int tmp[] = {1,2,3};  
  25.         Class<?> c3 = tmp.getClass().getComponentType();  
  26.         System.out.println(c3.getName());  
  27.         System.out.println("第一个数:"+Array.get(tmp,0));  
  28.         Array.set(tmp,0,5);  
  29.         System.out.println("第一个数:"+Array.get(tmp,0));  
  30.   
  31.         Object arr = Array.newInstance(c3,5);  
  32.         System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));  
  33.         System.out.println(Array.get(arr,2));  
  34.         System.out.println(Array.get(arr,3));  
  35.     }  
  36. }  


  1. import java.lang.reflect.*;  
  2. interface China{  
  3.     public static final String NAME = "CHINA";  
  4.     public int AGE = 60;  
  5.     public void sayHello();  
  6.     public String sayHello2(String name,int age);  
  7. }  
  8. class Person implements China{  
  9.     private String name;  
  10.     private int age;  
  11.     public String getName(){  
  12.         return name;  
  13.     }  
  14.     public void setName(String name){  
  15.         this.name = name;  
  16.     }  
  17.     public int getAge(){  
  18.         return age;  
  19.     }  
  20.     public void setAge(int age){  
  21.         this.age = age;  
  22.     }  
  23.     public void sayHello(){  
  24.         System.out.println(NAME+"  "+AGE);  
  25.     }  
  26.     public String sayHello2(String name,int age){  
  27.         return name+" "+age;  
  28.     }  
  29. }  

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值