Java反射机制

本文详细介绍了Java反射机制的使用方法,包括如何通过不同方式获取Class对象、操作字段(Field)、构造器(Constructor)等核心概念。并通过具体示例展示了如何利用反射机制实现动态创建对象及修改字段值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了一下Java的反射机制,发现关键字new是造成耦合度高的重要原因,感觉对反射没有什么总结,看了一篇博客园的文章,觉得总结的不错,就转载过来学习一下了!

下面是主要的内容:

1. /** 

2.  * 反射机制有三种方法 

3.  */  

4. @Test  

5. public void testGetClass() throws ClassNotFoundException {  

6.     Class clazz = null;  

7.   

8.     //1 直接通过类.Class的方式得到  

9.     clazz = Person.class;  

10.       System.out.println("过类: " + clazz);  

11.     

12.       //2 过对象的getClass()方法,这个使用的少(一般是传的是Object,不知道是什么型的候才用)  

13.       Object obj = new Person();  

14.       clazz = obj.getClass();  

15.       System.out.println("getClass(): " + clazz);  

16.     

17.       //3 取,用的比多,但可能抛出ClassNotFoundException异常  

18.       clazz = Class.forName("com.java.reflection.Person");  

19.       System.out.println(": " + clazz);  

20.   }  

21.     /** 

22.      * Field: 封装了字段的信息 

23.      */  

24.     @Test  

25.     public void testField() throws  

26.             ClassNotFoundException, NoSuchFieldException, IllegalAccessException {  

27.       

28.         Class clazz = Class.forName("com.java.reflection.Person");  

29.       

30.         //1取字段  

31.         //1.1 获取Field的数,私有字段也能  

32.         Field[] fields = clazz.getDeclaredFields();  

33.         for (Field field: fields) {  

34.             System.out.print(field.getName() + ", ");  

35.         }  

36.       

37.         //1.2 获取指定名字的Field(如果是私有的,下面的4)  

38.         Field field = clazz.getDeclaredField("name");  

39.         System.out.println("\n获取指定Field=: " + field.getName());  

40.       

41.         Person person = new Person("ABC", 12);  

42.         //2取指定象的Field  

43.         Object val = field.get(person);  

44.         System.out.println("获取指定对象字段'name'Field= " + val);  

45.       

46.         //3置指定象的Field  

47.         field.set(person, "changwen2");  

48.         System.out.println("设置指定对象字段'name'Field=: " + person.name);  

49.       

50.         //4、若字段是私有的,需要setAccessible(true)方法  

51.         Field field2 = clazz.getDeclaredField("age");  

52.         field2.setAccessible(true);  

53.         System.out.println("获取指定私有字段名=: " + field2.getName());  

54.     }  

55.     /** 

56.      * 一个例: 

57.      * 反射取一个Person2Student 

58.      * 设置字段"age"=20(该字段可能为私有,可能在其父类中) 

59.      */  

60.     @Test  

61.     public void testClassField() throws ClassNotFoundException, IllegalAccessException, InstantiationException {  

62.         String className = "com.java.reflection.Student";  

63.         String fieldName = "age";  //可能私有,可能在其父  

64.         Object val = 20;  

65.       

66.         //创建className 对应类的对象,并为其fieldName赋值为val  

67.         Class clazz = Class.forName(className);  

68.         Field field = null;  

69.         for (Class clazz2 = clazz; clazz2 != Object.class; clazz2 = clazz2.getSuperclass()){  

70.             try {  

71.                 field = clazz2.getDeclaredField(fieldName);  

72.             } catch (Exception e) {  

73.       

74.             }  

75.         }  

76.       

77.         Object obj = clazz.newInstance();  

78.         assert field != null;  

79.         field.setAccessible(true);  

80.         field.set(obj, val);  

81.       

82.         Student stu = (Student) obj;  

83.         System.out.println("age = " + stu.getAge());  

84.     }  

85.     /** 

86.      * 构造器:开用的比 

87.      */  

88.     @Test  

89.     public void testConstructor() throws ClassNotFoundException, NoSuchMethodException,  

90.             IllegalAccessException, InvocationTargetException, InstantiationException {  

91.         String className = "com.java.reflection.Person";  

92.         Class<Person> clazz = (Class<Person>) Class.forName(className);  

93.       

94.         //1.获取Constructor对象  

95.         Constructor<Person>[] constructors =  

96.                 (Constructor<Person>[]) Class.forName(className).getConstructors();  

97.       

98.         for (Constructor<Person> constructor: constructors) {  

99.             System.out.println(constructor);  

100.       }  

101.     

102.       Constructor<Person> constructor = clazz.getConstructor(String.class, Integer.class);  

103.       System.out.println("指定的-->" + constructor);  

104.     

105.       //2.调用构造器的newInstance()方法  

106.       Object obj= constructor.newInstance("changwen", 11);  

107.   }  


以上是java反射机制的主要方法

想知道更完整的内容,就去看原文即可:

原文出处:https://www.cnblogs.com/bojuetech/p/5896551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值