java 利用反射获取内部类静态成员变量的值操作
作者:常乐_smile 时间:2023-03-28 21:30:04
昨晚,一同事问到我,怎么利用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();
}
}
}
运行后打印,如下:
来源:https://changle.blog.csdn.net/article/details/73198205
标签:java,反射,内部类,静态成员,变量值
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#去除字符串中的反斜杠实例(推荐)
2022-02-02 20:27:14
![](https://img.aspxhome.com/file/2023/3/119513_0s.jpg)
C#更改tabControl选项卡颜色的方法
2022-09-07 19:30:14
Android编程之ProgressBar圆形进度条颜色设置方法
2022-03-11 15:26:25
![](https://img.aspxhome.com/file/2023/7/138297_0s.jpg)
Android 偷拍功能实现(手机关闭依然拍照)详解及实例代码
2023-01-08 00:23:19
![](https://img.aspxhome.com/file/2023/9/114289_0s.png)
java基础入门之IO流
2022-08-17 00:09:20
![](https://img.aspxhome.com/file/2023/7/128927_0s.jpg)
Android BottomSheet实现可拉伸控件
2023-07-05 15:07:51
Java单例模式的应用示例
2023-08-22 06:54:03
![](https://img.aspxhome.com/file/2023/4/88754_0s.png)
c#中Empty()和DefalutIfEmpty()用法分析
2022-05-20 12:58:55
![](https://img.aspxhome.com/file/2023/4/106374_0s.png)
Java利用递归算法实现查询斐波那契数
2023-08-04 00:02:29
![](https://img.aspxhome.com/file/2023/4/119064_0s.png)
详解Android Studio 3.0的新特性与适配
2023-04-29 05:15:05
![](https://img.aspxhome.com/file/2023/1/139111_0s.jpg)
Java语言中4种内部类的超详细讲解
2022-02-23 18:08:10
Android实现录音声波图
2022-08-05 20:55:49
springboot +rabbitmq+redis实现秒杀示例
2022-04-21 02:29:28
![](https://img.aspxhome.com/file/2023/0/79940_0s.jpg)
C# Socket网络编程实例
2023-03-18 05:09:28
Java之String、StringBuffer、StringBuilder的区别分析
2022-12-29 10:38:05
C#访问及调用类中私有成员与方法示例代码
2022-06-02 05:30:35
![](https://img.aspxhome.com/file/2023/5/96375_0s.jpg)
Android中butterknife的使用与自动化查找组件插件详解
2021-09-18 06:58:36
![](https://img.aspxhome.com/file/2023/3/137713_0s.jpg)
SpringBoot实现配置文件的替换
2023-11-21 22:27:16
Android实现Service获取当前位置(GPS+基站)的方法
2023-04-03 16:28:28
![](https://img.aspxhome.com/file/2023/8/126798_0s.png)
C#中函数的创建和闭包的理解
2022-08-17 01:14:35
![](https://img.aspxhome.com/file/2023/9/111109_0s.png)