反射的应用与理解

反射就是把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 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

跟着柴毛毛学Spring(2)——Bean的配置

Java中创建一个对象分两步: 1.通过关键字new创建一个对象 2.通过构造函数或setter函数为对象添加初始化参数 当Spring出现后,对象...

3305
来自专栏Kiba518

C#语法——泛型的多种应用

泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性、类型安全性和效率。

793
来自专栏java一日一条

Java 解惑:Comparable 和 Comparator 的区别

Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下。

562
来自专栏Hongten

Java Web javaBean

<jsp:useBean class="webbook.chapter9.Book" id="book" scope="page"/>

502
来自专栏Java帮帮-微信公众号-技术文章全总结

16(03)总结增强for循环,静态导入,可变参数

3:增强for循环(掌握) (1)是for循环的一种 (2)格式: for(元素的数据类型 变量名 : 数组或者Collection集合的对象) { 使...

3627
来自专栏用户2442861的专栏

java泛型(一)、泛型的基本介绍和使用

http://blog.csdn.net/lonelyroamer/article/details/7864531

691
来自专栏老马说编程

(63) 实用序列化: JSON/XML/MessagePack / 计算机程序的思维逻辑

上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/Message...

2348
来自专栏java一日一条

深入剖析Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中...

561
来自专栏IT可乐

Java 反射详解

  反射反射,程序员的快乐! 一、什么是反射?   通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;...

1707
来自专栏每日一篇技术文章

Swift3.0 - 文本输出

491

扫码关注云+社区