Test4_理解java反射机制的概念以及应用

本文深入探讨Java反射机制,详细解释如何使用反射API获取类的构造方法、成员变量和方法,并展示其实现过程。通过实例代码演示如何利用反射创建对象、访问私有成员及调用方法,同时解决编译与运行时的差异性问题。重点解析反射在实际开发中的应用,提供深入理解与高效实践的指南。

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

1.反射就是把Java类中的各种成分映射成相应的java类;
--------------------------------------------------------------------
2.一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示
,通过调用Class类的方法可以得到这些实例对象后,得到这些事例对象
有什么用呢?怎么用呢?这正是学习和应用反射的要点。
--------------------------------------------------------------------
Constructor 类  字节码中的构造方法
--------------------------------------------------------------------
3.
Constructor[] constructor = Class.forName("java.lang.String").getConstructor()


//得到String类所有的构造方法




	Constructor constructor = String.class.getConstructors(StringBuffer.class);
	//表示得到一个参数是StringBuffer类型的构造方法
	String str2 = (String)constructor.newInstance(new StringBuffer("xxx"));
	//利用刚才取得String类构造方法的实例 new一个对象   注意:参数要相符取得什么参数的构造方法
	//  new对象的时候就传什么参数


        上面两行代码中,在编译的时候并不知道第二行中的constructor对象是哪个类的构造方法
只知道他是一个构造方法,而在运行期,通过执行第一行代码,constructor才被覆上值,证明他是
String类型的构造方法,但是这点在编译的时候是不得而知的,所以 .newInstance()方法返回的是Object
类型的对象。
编译(翻译成.class)的时候,只是进行语法检查,并不执行
---->之前没有明白的问题,今天终于解开了 
--------------------------------------------------------------------
4.也可以通过Class.newInstance() 实例化一个 对象
->通过看JDK源代码得知,Class.newInstance()方法是先取得无参的构造方法,然后缓存起来,再实例化对象
以后再实例化的时候就不用实力化了,而是直接到内存中调用,

从以上也可以从侧面反映出,反射消耗性能(缓存缘故)
--------------------------------------------------------------------
Field 类   -->字节码中的成员变量 
--------------------------------------------------------------------
5.
public class ReflectPoint{
		private int x;
		public int y;
		public ReflectPoint(int x,int y){
			this.x = x;
			this.y = y;
		}
	}
	public class ReflectTest	{
		public static void main(String[] args){
			ReflectPoint pt1 = new ReflectPoint(3,5);
			Field fieldY = pt1.getClass().getField("y");
			//fieldY的值是5吗? 错! ReflectPoint可以生成多个对象 每个对象都有fieldY
			//fieldY代表类中的变量  而不是对象的变量,要用它去取每个对象上的fieldY的值
			fieldY.get(pt1);
			//取出pt1对象的fieldY的值


	//		Field fieldY = pt1.getClass().getField("x");
	//		fieldX.get(pt1);//此时报错 因为x是private的修饰的  看不见


			Field fieldX = pt1.getClass().getDeclareField("x");//看见了 拿不到
			fieldX.setAccessible(true);// 加此句 能拿到了
			System.out.println(fieldX.get(pt1));
		}
	}


--------------------------------------------------------------------
6.题目:把一个类中的所有Stirng类型的变量中的"b"换成"a";
							import java.lang.reflect.Field;
							 class Person{
								
								 String name ="abc";
								 int age =20;
								 String sex = "man";
								 String fav = "basketball";
							}
							public class Test {


								public static void main(String[] args) throws Exception{
									
										Person p = new Person();
										Field[] f =p.getClass().getFields();
										for(int i =0;i<f.length;i++){
											if(f[i].getType()==String.class){
												
												String s =(String)f[i].get(p);
												s=s.replace("b", "a");
												f[i].set(p, s);
									//			System.out.println(f[i].get(p));
											}
										}
								}
							}


--------------------------------------------------------------------
Method 类   (字节码中的方法)
--------------------------------------------------------------------
7. 取得String类的charAt()方法
		Method methodCharAt = String.class.getMethod("charAt",int.class);//第一个参数是方法名,第二个参数是方法参数的Class类型
		System.out.println(methodCharAt.invoke(str1,1));//如果Str="abc" 打印值为 b
									//str1在这里是指调用此方法的变量 ,1是指调用此方法传的参数(charAt方法)
									//如果为静态方法,则写null


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值