zoukankan      html  css  js  c++  java
  • 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方法

  • 相关阅读:
    VC 编译 MATLAB 的 mex 文件
    MATLAB 与 Excel 接口
    MATLAB 编译器的使用
    为什么安装了MinGW之后,还是不能在Matlab中使用mex?
    matlab文件操作
    matlab外部程序接口-excel
    数字图像加密-同态加密方案
    matlab数字图像简单的加密方法
    matlab中矩阵的表示与简单操作
    linux 安装eccodes环境
  • 原文地址:https://www.cnblogs.com/njust-ycc/p/6785048.html
Copyright © 2011-2022 走看看