Java再学习-反射机制

首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了。废话不说,上主题!

Java反射机制

运行时

判断任意一个对象所属的类

构造任意一个类的对象

判断任意一个类所具有的成员变量和方法

调用一个对象的方法


注意点:运行时,而不是编译时


首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧。


通过反射来进行方法调用的具体步骤:

1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段)

2.如果想调用方法获取Method对象(),如果想操作字段就要获取Field[]对象


上面这两点一会儿下面的代码中都会体现的,大家不要着急。


小编这里想说两点,关于调用类的构造方法的实现,当然构造方法分成带参数和不带参数的,先来一段不带参数


Class c = Test.class;
c.newInstance();


另一种写法:


Constructor con = c.getConstructor(new Class[]{});
con.newInstance(new Object[]{});

带参数的构造方法调用


Class c = Test.class;
Constructor con = c.getConstructor(new Class[]{double.class,int.class});
con.newInstance(new Object[]{1.2,3})//类型一致

再次声明。反射是各大框架的基础,通过反射我们可以获取类,类的方法,类的变量等等,这样才会有了现在的Struts,spring等等。


最后来看一段代码:

package cn.tgb.reflection;

public class PrivateTest {
	
	private String name = "hello";
	
	public String getName(){
		return this.name;
	}
}

问:如果将变量name的值,换成world呢?

当然,通过反射的方式了,来看下一段代码吧。


package cn.tgb.reflection;

import java.lang.reflect.Field;

public class ReflectionTest {
	
	public static void main(String[] args) throws Exception {
		
		PrivateTest pt = new PrivateTest();
		
		Class<?> clazz = PrivateTest.class;
		
		Field field = clazz.getDeclaredField("name");
		
		field.setAccessible(true);//压制java的访问控制检查。
		
		field.set(pt, "world");
		
		System.out.println(field.get(pt));
		
	}
}


大家可以运行一下上面的代码,看看输出的结构是否是world。最后通过反射,获取类中的字段名,然后通过set的方式就可以修改字段的名啦。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值