Java反射基础(二)
获取域
1. 通过反射API可以获取到类中公开的静态域和对象中的实例域。得到表示域的java.lang.reflect.Field类的对象之后,就可以获取和设置域的值。
与获取构造方法类似,Class类中有4个方法用来获取域:
getFileds()、getFiled(fieldName)、 getDeclaredFields()、getDeclaredField(fieldName),其含义与获取构造方法的4个方法类似。
静态域和实例域的区别是:在使用静态域的时候,不需要提供具体对象实例,使用null即可,也可以使用对象实例;而使用实例域的时候,必须提供对象实例。
1 package jichu; 2 /** 3 *@author 作者 Yu chenchen 4 *@version 创建时间:2017年4月29日 下午1:32:38 5 *类说明: 6 */ 7 public class User { 8 public String name; 9 public static int age; 10 private double salary; 11 12 public void print1(){ 13 System.out.println("调用公有非静态print1方法"); 14 } 15 public static void print2(){ 16 System.out.println("调用公有静态print2方法"); 17 } 18 private void print3(){ 19 System.out.println("调用私有print3方法"); 20 } 21 22 public String getName() { 23 return name; 24 } 25 public void setName(String name) { 26 this.name = name; 27 } 28 public static int getAge() { 29 return age; 30 } 31 public static void setAge(int age) { 32 User.age = age; 33 } 34 public double getSalary() { 35 return salary; 36 } 37 public void setSalary(double salary) { 38 this.salary = salary; 39 } 40 }
1 package jichu; 2 3 import java.lang.reflect.Field; 4 5 /** 6 *@author 作者 Yu chenchen 7 *@version 创建时间:2017年4月29日 下午12:20:50 8 *类说明: 9 */ 10 public class TestReflectionFields { 11 12 public void test() throws Exception{ 13 //获取公开实例域 14 User user = new User(); 15 Field fieldName = User.class.getDeclaredField("name"); 16 //设置实例域值时,必须传入实例对象 17 fieldName.set(user, "ycc"); 18 19 //获取静态域 20 Field fieldAge = User.class.getDeclaredField("age"); 21 //设置静态域值时,传入null 22 fieldAge.set(null, 25); 23 //设置静态域值时,也可以传入实例对象 24 fieldAge.set(user, 26); 25 26 //获取私有域 27 Field fieldSalary = User.class.getDeclaredField("salary"); 28 //必须设置可以访问私有域权限 29 fieldSalary.setAccessible(true); 30 fieldSalary.set(user,1000.00); 31 32 System.out.println(user.name); 33 System.out.println(User.age); 34 System.out.println(user.getSalary()); 35 36 } 37 public static void main(String[] args) { 38 try { 39 new TestReflectionFields().test(); 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 } 44 }
输出:
ycc
26
1000.0
获取方法
4个获取方法:
getMethods() 、 getMethod(methodName)、 getDeclaredMethod(methodName)、 getDeclaredMethods()
1 package jichu; 2 3 import java.lang.reflect.Method; 4 5 /** 6 *@author 作者 Yu chenchen 7 *@version 创建时间:2017年4月29日 下午1:23:01 8 *类说明: 9 */ 10 public class TestReflectionMethods { 11 12 public static void main(String[] args) throws Exception { 13 User user = new User(); 14 //获取公有非静态方法 15 Method method1 = User.class.getDeclaredMethod("print1"); 16 method1.invoke(user); 17 18 //获取公有静态方法 19 Method method2 = User.class.getDeclaredMethod("print2"); 20 method2.invoke((User)null); 21 //也可以这样 22 method2.invoke(user); 23 24 //获取私有方法 25 Method method3 = User.class.getDeclaredMethod("print3"); 26 //必须设置可以访问私有方法权限 27 method3.setAccessible(true); 28 method3.invoke(user); 29 30 } 31 32 }
输出:
调用公有非静态print1方法
调用公有静态print2方法
调用公有静态print2方法
调用私有print2方法