java 利用反射获取内部类静态成员变量的值操作

昨晚,一同事问到我,怎么利用java反射解析内部类静态成员变量的值,于是顺手写下了。

废话不多说,直接上代码!

待解析类结构如下:

/**
 * @Author changle
 * @Time 17/6/13.
 * @Desc to do
 */
public class Goods {
 static class apple{
  public static String version = "iphone6s[是手机不是吃的苹果]";
  public static String date = "生产日期 2017-06-13";
 }
}

获取内部类静态成员变量工具类:

/**
 * @Author changle
 * @Time 17/6/13.
 * @Desc 获取静态内部类静态变量
 */
public class TestParseInnerProValue {
 public static void main(String[] args) {
  Class<?> clasz = Goods.class;
  printInnerParamValue(clasz);
 }

 public static void printInnerParamValue(Class<?> clasz){
  Class innerClazz[] = clasz.getDeclaredClasses();
  for(Class claszInner : innerClazz){
   Field[] fields = claszInner.getDeclaredFields();
   for(Field field : fields){
    try {
     Object object = field.get(claszInner);
     System.out.println("获取到的feild, name=" + field.getName()+", value="+ object.toString());
     //打印内容
     /*
     * 获取到的feild, name=version, value=iphone6s[是手机不是吃的苹果]
      获取到的feild, name=date, value=生产日期 2017-06-13
     * */
    } catch (IllegalAccessException e) {
     e.printStackTrace();
    }

   }
  }
 }
}

补充知识:Java 利用反射机制获取内部类的私有属性和方法,并且修改私有属性的值

废话不多说直接贴代码,代码中有注释,如下:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
  @SuppressWarnings("unused")
  class Test1{
    //私有属性
    private String color = "blue";

    //无参数的私有方法使用私有属性
    private void queryColor(){
      System.out.println(color);
    }

    //一个参数的私有方法
    private void privateTest1(String param1) {
      System.out.println(">>>>>>" + param1 + ">>>>>>>>>" + color +">>>>>>>>>>");
    }

    //两个参数的私有方法
    private void privateTest2(String param1,String param2) {
      System.out.println(">>>>>>" + param1 + ">>>>>>>>>"+ param2 + ">>>>>>>>");
    }
  }

  /**
   * @Title: main
   * @Description: 利用反射机制获取内部类的私有属性和方法,并且修改私有属性的值
   * @param args
   * @author songye
   * @date Jul 19, 2018 10:17:32 AM
   * @return: void
   */
  public static void main(String[] args) {
    try {
      Test test = new Test();
      Test1 test1 = test.new Test1();
      //获取内部类的私有属性
      Field colorField = Test1.class.getDeclaredField("color");
      //设置为true表示可以访问private修饰的私有属性
      colorField.setAccessible(true);
      System.out.println(colorField);
      //color的值改为red
      colorField.set(test1, "red");

      //获取内部类的私有方法,无参数的
      Method method = Test1.class.getDeclaredMethod("queryColor");
      //设置为true表示可以访问private修饰的私有方法
      method.setAccessible(true);
      System.out.println(method);
      //用来执行指定对象的方法,无参数的
      method.invoke(test1);

      //获取内部类的私有方法,一个参数的
      Method method1 = Test1.class.getDeclaredMethod("privateTest1",String.class);
      //设置为true表示可以访问private修饰的私有方法
      method1.setAccessible(true);
      System.out.println(method1);
      //用来执行指定对象的方法,前面test1是对象,后面的是一个参数
      method1.invoke(test1,"我调用了你的私有方法!!!");

      //获取内部类的私有方法,两个参数的
      Method method2 = Test1.class.getDeclaredMethod("privateTest2",String.class,String.class);
      //设置为true表示可以访问private修饰的私有方法
      method2.setAccessible(true);
      System.out.println(method2);
      //用来执行指定对象的方法,前面test1是对象,后面的是两个参数
      method2.invoke(test1, "用我的参数1","用我的参数2");
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}

运行后打印,如下:

以上这篇java 利用反射获取内部类静态成员变量的值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的静态内部类详解及代码示例

    1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

  • Java单例模式实现静态内部类方法示例

    Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式.接下来我们看看具体介绍. Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下

  • java中staticclass静态类详解

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的.由于静态的内部类在定义.使用的时候会有种种的限制.所以在实际工作中用到的并不多. 在开发过程中,内部类中使用的最多的还是非静态地成员内部类.不过在特定的情况下,静态内部类也能够发挥其独特的作用. 一.静态内部类的使用目的. 在定义内部类的时候,可以在其前面加上一个权限

  • java 利用反射获取内部类静态成员变量的值操作

    昨晚,一同事问到我,怎么利用java反射解析内部类静态成员变量的值,于是顺手写下了. 废话不多说,直接上代码! 待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class apple{ public static String version = "iphone6s[是手机不是吃的苹果]"; public static String date =

  • Java利用反射获取object的属性和值代码示例

    在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. referance:Java反射简易教程 import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 反射处理Bean,得到里面的属性值 * * @author liulinsen * */ publ

  • 利用反射获取Java类中的静态变量名及变量值的简单实例

    JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了. public class Test { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //获取所有变量的值 Class clazz = Class.forName("com.qianmingxs.ScoreTable"); Field[] fields = clazz.g

  • Java利用反射自动封装成实体对象的方法

    本文实例讲述了Java利用反射自动封装成实体对象的方法.分享给大家供大家参考.具体分析如下: 利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 复制代码 代码如下: //获取页面数据,自动封装成bean对象 public List getObjectList(Class clazz,String[] rowNos) throws Exception{         List objList

  • c#反射机制学习和利用反射获取类型信息

    1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域-程序集-模块-类型-成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局. 程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集.模块和类型的对象.我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段

  • Java利用反射实现框架类的方法实例

    框架类的简单实现 实现步骤: 1. 加载配置文件 2. 获取配置文件中定义的数据 3. 加载该类进内存 主要讲解第一步:加载配置文件 的相关知识. //1.加载配置文件 //1.1创建Properties对象 Properties pro = new Properties(); //1.2加载配置文件,转换为一个集合 //1.2.1获取class目录下的配置文件 ClassLoader classLoader = ReflectTest.class.getClassLoader(); Input

  • Java利用反射实现文件的读取操作

    java反射 java从很早的版本开始就引入了反射机制,java如今的框架底层大部分也都是使用反射实现的. 这篇博客就去探索下java反射使用的方便之处. 要说java的反射机制,肯定离不开Class这个类,我们从jdk的源码可以看到这个类在jdk1.0的时候就存在了. 由于我这边需要用到文件读写的功能,同时又希望写的方法相对来说比较抽象,能在多出直接使用,于是我就想到了java的反射机制. 首先这边先把我的读取文件的方法展示出来 这个是用到的接口类 /** * 实现该接口中的方法,本来打算在F

  • Java利用反射对list对象做过滤

    目录 1.对象结构 2.根据字段名获取value 3.对list过滤 4.精确匹配 5.模糊匹配 ​反射对效率有影响 慎用!!!​ 1.对象结构 public class BusinessDept { private String year;//年 private String month;//月 private String deptName;//部门名称 private String deptLeader;//部门负责人 private Double jyz; //经营值 private D

  • Java使用反射获取list泛型过程浅析

    通过属性来获取泛型的类型 Field[] fields = bean.getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); if(f.getType() == java.util.List.class){ // 如果是List类型,得到其Generic的类型 Type genericType = f.getGenericType(); if(genericType == null) contin

  • Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

随机推荐