反射基本概念

在java运行时环境中,对于任意一个类,能够动态的获取类的信息,动态调用类的方法。 
在运行期间:判断,构造,调用任意一个类的成员变量和方法。而在编译期间:我们是用new 创建java的对象。 
通过reflection机制,我们可以在运行时取得任何一个已知名称的class的内部信息,包括其修饰符,以及superclass,interfaces,也包括fields和methods的所有信息。 
在jdk中主要由以下类来实现java反射机制: 
-class类, 
-Field类, 
-Mehtod类, 
-Array类。 

------------------ 
动态语言定义:程序运行时,允许改变程序结构或者变量类型,这种语言称为动态语言。从这个观点看,perl,python,ruby,javasacript是动态语言,c++,java,c#不是动态语言。但是java却有一个非常突出的动态相关机制,Reflection。 

---------------------- 
1.要想使用反射,首先需要获得待处理类或对象的class对象 
2.获取class的三种方法。 
1)通过Class.forName(""); 
2)通过类.class,eg:string.class; 
3)通过对象的 obj.getClass(); 
3.若想通过类的不带参数的构造方法生成对象,有两种方式: 
a)先获得class对象,然后通过class对象的newInstance()方法直接生成即可 
b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class; 
Constructor cons=classType.getConstructor(new Class[]{}); 
Object obj=new cons.newInstance(new Object[]{}); 
4. 
若想通过类的带参数的构造方法生成对象,只有一个方法: 
先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class; 
Constructor cons=classType.getConstructor(new Class[String.class,int.class]{}); 
Object obj=new cons.newInstance(new Object[]{"abing",5}); 

5.通过反射可以调用一个对象的private方法,或者修改一对象的private属性。 

Java代码
  1. import java.lang.reflect.Field;  
  2. import java.lang.reflect.Method;  
  3.   
  4.   
  5.   
  6. class User{  
  7.       
  8.      private String userName="";  
  9.        
  10.         public String getUserName() {  
  11.         return userName;  
  12.     }  
  13.         public int add(int a, int b) {  
  14.             return a + b;  
  15.         }  
  16.         private int minus(int a,int b)  
  17.         {  
  18.             return a-b;  
  19.         }  
  20.   
  21. }  
  22. public class ReflectTest {  
  23.      
  24.     /** 
  25.      * @param args 
  26.      */  
  27.     public static void main(String[] args) throws Exception {  
  28.           
  29.         Class<?> classType=Class.forName("User");//得到class对象  
  30.         Method[] meth=classType.getDeclaredMethods();//得到该class所有声明method  
  31.         for (Method method : meth) {  
  32.             System.out.println("method:"+method);  
  33.         }  
  34.         Field [] fiel=classType.getDeclaredFields();//得到该class所有声明field  
  35.         for (Field field : fiel) {  
  36.             System.out.println("fiueld:"+field);  
  37.         }  
  38.         User user=(User)classType.newInstance();//通过class获得User对象  
  39.         Method method=classType.getMethod("add",new Class<?>[]{int.class,int.class});//获取add方法,考虑到方法重载,还要加上参数条件才能唯一限定一个方法  
  40.         int result=(Integer)method.invoke(user, new Object[]{3,9});//通过invoke调用方法  
  41.         System.out.println("addresult:"+result);  
  42.         /** 
  43.          * 通过反射来访问方法的私有方法 
  44.          */  
  45.         Method methodminus=classType.getDeclaredMethod("minus",new Class<?>[]{int.class,int.class});//通过getDeclaredMethod取得私有的方法  
  46.         methodminus.setAccessible(true);//将可访问性设置为true  
  47.         int resultminus=(Integer)methodminus.invoke(user, new Object[]{3,9});//通过invoke调用方法  
  48.         System.out.println("resultminus:"+resultminus);  
  49.         /** 
  50.          * 通过反射来访问方法的私有属性 
  51.          */  
  52.         Field field=classType.getDeclaredField("userName");  
  53.         field.setAccessible(true);//将可访问性设置为true  
  54.         field.set(user, "bingyingao");//给私有属性userName赋值  
  55.         System.out.println(user.getUserName());  
  56.     }  
  57.   
  58. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值