Java反射机制浅析


  •  概念:

Java反射技术:允许程序在执行期取得任何已知名称的类的任何内部信息。包括:包名、类名、属性、内部类、结构体、方法,并可以在执行期变更字段内容和唤起方法。

 

  •   使用步骤:

 

使用反射机制的步骤:

获取你操作类的Class对象->获取类中的信息->使用Reflection API操作这些信息(设置字段值、调用方法等)

使用反射机制步骤的相关函数:

              forName(...)->newInstance()->getDeclaredConstructors()/getDeclaredFields()/getDeclaredMethods()等->Constructor/Method/Field类中的相关方法

注:private字段方法需要setAccessible()

 

  •   关键API解析:

反射机制中的主要包和类: java.lang.reflect、java.lang.Class

 

java.lang.reflect中

类Constructor、Field、Method继承自java.lang.reflect.AccessibleObject

1.   AccessibleObject类提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。

关键方法:

public static void setAccessible(AccessibleObject[] array,Boolean flag)

public void setAccessible(Booleanflag)

值为true则指示反射的对象在使用时应该取消Java语言访问检查。

 

2.      public final class Construcor<T>extends AccessibleObject

提供了构造函数的修饰、名称、参数、参数类型等一系列方法。

关键方法:

public T newInstance(Object…initargs):使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

 

3.      public final class Fieldextends AccessibleObject

提供了获取Field的修饰、字段名称、字段类型、字段的值、设置字段的值的一系列方法。

关键方法:

public Object get(Object obj):返回指定对象上此Field表示的字段的值。类似的有getInt(Objectobj),getFloat,getDouble等

public void set(Object obj,Object value):将指定对象变量上此Field对象表示的字段设置为指定的新值。类似的有setBoolean(Object obj,Boolean z)等。

 

4.      public final class Methodextends AccessibleObject

提供获取Method的名称、修饰、参数类型、返回值类型等一系列相关的方法.

关键方法:

public Object invoke(Objectobj,Object… args):调用该方法

Obj:从中调用底层方法的对象;

args:用于方法调用的参数。

 

 

java.lang.Class中:

1.      提供了获取类中的字段、方法、构造方法、父类、此类的包等一系列的方法

关键方法:

public static Class<?>forName(String className):Class实例化对象

public T newInstance():类className的一个实例化对象。


注意:上述方法的返回值就是定义在java.lang.reflect中的Constructor、Field、Method。

 

  •   具体实例:

 

_reflection类:将被反射调用的类

public class _reflection {
	private String username = "LiZZZZZQQQQ";
	private String password = "woyebuzhidao";
	
	private void printData1(){
		System.out.println("来自private void printData1()");
		System.out.println("username:"+username+"|"+"password:"+password);
	}
	public void printData2(){
		System.out.println("来自public void printData2()");
		System.out.println("username:"+username+"|"+"password:"+password);
	}
}

mainRefelction类:反射调用_reflection类中的字段方法

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class mainRefelction {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//第1步:获取要操作类的Class实例
			Class class1 = Class.forName("_reflection");//Class的实例化
			Object object = class1.newInstance();//_reflection的实例化
			
			//第2步:获取要操作类中的字段与方法
			Field fields[] = class1.getDeclaredFields();
			Method methods[] = class1.getDeclaredMethods();
			
			//调用Field中的方法,设置和输出字段的值
			int num1 = fields.length;
			for(int i=0;i<num1;i++){
				//取消Java语言访问检查
				fields[i].setAccessible(true);
				System.out.println(fields[i].getName()+":"+fields[i].get(object));
			}
			
			//设置某个确定Field的值
			Field field = class1.getDeclaredField("password");
			field.setAccessible(true);
			field.set(object, "012345789");
			
			//调用_reflection中的方法
			int num2 = methods.length;
			for(int j=0;j<num2;j++){
				methods[j].setAccessible(true);
				methods[j].invoke(object, null);
			}			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

结果:


CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值