反射的应用与理解

反射就是把Java类中的各种成分映射成相应的java类

<代理模式会用到反射,SSH框架会用到框架>

反射使用用中用到的是:字节码(获取类的字节码的三种方式)

例如:People p = new People();

1:Class cls =  Person.class

2:Class cls = p.getClass();

3:Class cls = Class.forName("包名+类名");

字节码的比较,用 “=” 比较,是否为同一份字节码if(f.getType() == String.class){

System.out.println("字节码相同");

}

下面来实战一些关于反射的例题:

 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反

射方式对age赋值。

定义一个People类

public class People {
	private String name;		//姓名
	private int age;		//年龄
	
	public People() {
		super();
	}
	public People(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

1>反射类的构造方法: (***********重点:调用构造方法的时候一定要有public修饰)

使用反射的方式调用构造函数初始化name、age

//使用反射的方式调用构造函数初始化name、age
Constructor<People> constructor = People.class.getConstructor(String.class,int.class);
People p1 = (People)constructor.newInstance("江中炼",21);
System.out.println("姓名:"+p1.getName()+"\t年龄:"+p1.getAge());

2>反射类的成员方法:(这代码我调用的是静态方法,null)

//使用反射方式调用setName方法对名称进行设置

//使用反射方式调用setName方法对名称进行设置
People p2 = new People();
Method method = People.class.getMethod("setName", String.class);
method.invoke(p2,"江中炼");
System.out.println("姓名:"+p2.getName());

特殊例子:(method对main方法的另一种应用)(TestArgument类写在Test类中)

class TestArgument {
	public static void main(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
		}
	}	
}

第一种直接获取打印

//main方法赋值!调用另一个TestArgument类的main方法
TestArgument.main(new String[]{"111","222","333"});

第二种反射获取打印

 //反射main方法赋值!
String startClassName = args[0];(类名+包名) 

args[0]表示Test测试类中的args的第一个参数,那怎么写进去呢?

右键Run as --> Run Configurations... -->(Main)旁边的那个:(x)=Arguments --> Program arguments: 里面写下TestArgument类的全面(包名+类名)

(在TestArgument处按下F2就有提示,复制下来就行了),那么args[0]就你刚刚赋的值了

//我们要调用的是main,它的参数是String[],也就是说它只接受字符串类型的数组;
Method mainMethod = Class.forName(startClassName).getMethod("main", String[].class);

***main是静态方法,所以不需要传对象,直接一个null就行

new String[]{"111","222","333"}首先要进行拆箱(为什么要拆箱,跟jdk1.4版本有关),也就是3个参数,但是我要一个数组,所以:(方法1)我要告诉java编译器,我传进来的是就是数组,不需要拆箱了

mainMethod.invoke(null, (Object)new String[]{"111","222","333"});

(方法2)我把它包两层,java编译器拆箱后,剩下的就是一个数组

mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});

3>反射类的成员属性:

//使用反射方式对age赋值

People p3 = new People();
//获取所有成员变量
	//Field fieldY = rp1.getClass().getField("age");	//获取所有public修饰的成员
Field field = People.class.getDeclaredField("age");//获取所有(包括private)修饰的成员
//强制访问(暴力反射)针对于私有变量
field.setAccessible(true);
field.set(p3, 21);
System.out.println("年龄:"+p3.getAge());

4>通过数组进行反射

Object obj = null;
obj = new String[]{"a","b","c"}
obj = "xyz";
Class cls = obj.getClass();
//判断obj是否是数组
if(cls.isArray()){
	int len = Array.getLength(obj);
for (int i = 0; i < len; i++) {
	System.out.println(Array.get(obj, i));
}
}else{
	System.out.println(obj);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

ehcache报错

jfinal2.0+tomcat7+ehcache2.6.11+Linux Linux version 2.6.18-164.el5 (mockbuild@x8...

3749
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

2608
来自专栏Hadoop数据仓库

Oracle sqlldr 如何导入一个日期列

1. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY X'9' TRAILING NULLCO...

1876
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1172
来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

471
来自专栏增长技术

App Guide相关

##TourGuide https://github.com/worker8/TourGuide

812
来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

2339
来自专栏跟着阿笨一起玩NET

c# 使用timer定时器操作,上次定时到了以后,下次还未执行完怎么处理

------解决方案-------------------------------------------------------- 开始的时候,禁用定时器,你...

3021
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

1472
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

1K4

扫码关注云+社区