Java反射之Field使用及说明

Java反射之Field使用及说明

1、 什么是反射?

反射 的目的是为了能在运行期间得到对象的结构(包括成员变量,方法,构造方法等),并可以在允许的情况下访问这些属性和方法。
反射的优点很明显,就是能够在运行时动态获取类的实例,提高灵活性;可与动态编译结合。
但是使用反射会使得程序性能较低,因为需要解析字节码,将内存中的对象进行解析。

Java反射api:
Field 类:Java.lang.reflec包中的类,表示类的成员变量,可用来获取和设置类之中的属性值。
Method 类:Java.lang.reflec包中的类,表示类的方法,可用来获取类中的方法信息或者执行方法。
Constructor 类:Java.lang.reflec包中的类,表示类的构造方法。

Field

一切反射相关的代码都从获得类对象开始。
 1) 先获取类对象,获取类对象后才可以获取到 Field 属性。
 获取类对象的3种获取方式:        
         1、类名.class;  // Class usr = User.class;
         2、对象名.getClass();   //Class usr= user.getClass();
         3、Class.forName(全限定名/全路径名)  //Class usr= Class.forName("com.reflect.entity.User");
         
 2) 反射机制实例化对象
		User user= (User) usr.newInstance();   
		
  此外:     
         获取全限定名:  usr.getName();            
         获取类名:      usr.getSimpleName();   
         获取访问修饰符: usr.getModifiers();   
         获取包名 :      usr.getPackage();      

获取属性:

 1)获取单个公共的属性 【非私有化】成员变量
	   Field field = user.getClass().getField("age"); //获取类或接口的指定的已声明字段
	   Field field = usr.getField("age");
	   
 2)获取单个公共的、私有的、最终的等等属性 【包括私有化】成员变量【暴力反射】 
		//属性的访问修饰符1:代表public  2:代表private  0:代表没有修饰符
	   Field field = user.getClass().getDeclaredField("age");
	   Field field = usr.getDeclaredField("age");
		
 3)获取所有公共的属性【只有非私有化的】【暴力反射】
	   Field[] fields = usr.getFields();	//然后foreach
		
 4)获取所有公共的、私有的、受保护的、最终的等等属性 【包括私有化】成员变量【暴力反射】 
		Field[] fields = usr.getDeclaredFields();  

 5)获取K类父类
         Class clazz = req.getClass().getSuperClass();
      
 6)获取属性名:field.getName();    
                    
 7)获取属性类型: filed.getType();           
          
 8)获取属性访问修饰符 :field.getModifiers();    

获取方法:

1)获取单个公共的、私有的、最终的等等方法
        Method method = sysUser.getClass().getDeclaredMethod("setName", String.class);
        method.invoke(sysUser, "花和尚");//调用
        System.err.println(sysUser.getName());//打印结果:花和尚
	       
2)获取所有公共的方法
	Method[] methods = user.getClass().getMethods();	//foreach
		
3)获取所有公共的、私有的、受保护的、最终的等等方法
	Method[] methods = user.getClass().getDeclaredMethods();

通过反射api操作属性

        SysUser u4 = sysUser.getClass().newInstance();
        Field f = sysUser.getClass().getDeclaredField("name");
        f.setAccessible(true);//表示不用不需要做安全检查了,可以直接访问。
        f.set(u4, "hhhh");//给哪个对象设置属性,通过反射直接写属性,这里不能访问私有属性会报错
        System.out.println(u4.getName());//通过反射直接读属性
        System.out.println(f.get(u4));//把f的值 获取到
        
打印结果:
hhhh
hhhh

猜你喜欢

转载自blog.csdn.net/Little_Arya/article/details/129188745