`

反射学习

 
阅读更多

1、先来一个最简单的。通过反射得到方法、字段

 

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

import org.junit.Test;

public class Reflect1 {
	@Test
	public void getMethods() throws Exception{ //得到所有(自己类中)的方法,包括private的方法
		Class<?> strClazz = Class.forName("java.lang.String");
		Method[] declaredMethods = strClazz.getDeclaredMethods();
		
		for(Method method : declaredMethods){
			System.out.println(method.getName());
		}
		
	}
	@Test
	public void getFields() throws Exception{ //得到所有(自己类中)的字段,包括private的字段
		Class<?> strClazz = Class.forName("java.lang.String");
		Field[] declaredFields = strClazz.getDeclaredFields();
		
		for(Field field : declaredFields){
			System.out.println(field.getName());
		}
		
	}
}

 

 

 

 

2、通过反射调用方法

 

import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 通过反射调用方法
 * @author Administrator
 *
 */
public class Reflect2 {
	public Integer add(int num1 , int num2){
		return num1 + num2;
	}
	
	public String say(String name){
		return "hello "+name;
	}
	
	public String print(String str){
		return str;
	}
	public String print(){
		return "hello world";
	}
	
	/**
	 * 传统方式
	 * @description  
	 * @Date Jul 21, 2017
	 */
	@Test
	public void ordinaryTest(){
		Reflect2 r2 = new Reflect2();
		r2.add(1, 2);
		r2.say("张三");
		r2.print("hello world");
	}
	/**
	 * 通过反射调用方法
	 * @description  
	 * @Date Jul 21, 2017
	 */
	@Test
	public void reflectTest() throws Exception{
		Class<?> clazz = Reflect2.class; //得到class
		Reflect2 reflect2 = (Reflect2) clazz.newInstance(); //得到新的对象
		
		Method addMmethod = clazz.getMethod("add", new Class[]{int.class,int.class});
		Integer addResult = (Integer) addMmethod.invoke(reflect2, 1,3);
		System.out.println(addResult);
		System.out.println("----------------------------");
		
		Method sayMethod = clazz.getMethod("say", new Class[]{String.class});
		Object invoke = sayMethod.invoke(reflect2, "张三");
		System.out.println(invoke);
		System.out.println("----------------------------");
		
		Method printMethod = clazz.getMethod("print", new Class[]{String.class});
		Object invoke2 = printMethod.invoke(reflect2, "hello world");
		System.out.println(invoke2);
		System.out.println("----------------------------");
		Method printMethod2 = clazz.getMethod("print", new Class[]{});
		Object invoke3 = printMethod2.invoke(reflect2);
		System.out.println(invoke3);
	}
}

 

 

3、通过反射访问私有属性、方法

 

首先有个类

 

public class TestClass {
	
	private String name;
	
	public String address;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	private String say(){
		return "hello world";
	}
	private String say(String name){
		return "hello "+name;
	}
	
	
	public String say2(){
		return "hello world";
	}
	
	public String say2(String name){
		return "hello "+name;
	}
	
	
}

 

 

接着 通过反射访问上边类中的方法属性(包括私有方法属性)

 

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

import org.junit.Test;
/**
 * 反射访问私有方法,私有属性
 * @author Administrator
 *
 */
public class Reflect4 {
	/**
	 * 访问 public方法
	 * @description  
	 * @Date Jul 21, 2017
	 * @throws Exception
	 */
	@Test
	public void getPublicMethod() throws Exception{
		Class<?> clazz = TestClass.class;
		Object obj = clazz.newInstance();
		Method method1 = clazz.getDeclaredMethod("say2");
		Object value1 = method1.invoke(obj);
		System.out.println(value1);
		System.out.println("------------------------");
		Method method2 = clazz.getDeclaredMethod("say2",new Class[]{String.class});
		Object value2 = method2.invoke(obj, "张三");
		System.out.println(value2);
	}
	/**
	 * 访问私有方法
	 * @description  
	 * @Date Jul 21, 2017
	 * @throws Exception
	 */
	@Test
	public void testGetPrivateMethod() throws Exception{
		Class<?> clazz = TestClass.class;
		TestClass obj = (TestClass) clazz.newInstance();
		
		Method method1 = clazz.getDeclaredMethod("say");
		method1.setAccessible(true);  // 访问私有方法,如果不设置 会报错 java.lang.IllegalAccessException: Class com.test.reflect.Reflect4 can not access 
									 // a member of class com.test.reflect.TestClass with modifiers "private"
		Object value1 = method1.invoke(obj);
		System.out.println(value1);
		System.out.println("---------------------");
		Method method2 = clazz.getDeclaredMethod("say",new Class[]{String.class});
		method2.setAccessible(true);
		Object value2 = method2.invoke(obj, "张三");
		System.out.println(value2);
		System.out.println("---------------------");
		
		
	}
	/**
	 * 访问public 属性
	 * @description  
	 * @Date Jul 21, 2017
	 * @throws Exception
	 */
	@Test
	public void testGetPublicField() throws Exception{
		Class<?> clazz = TestClass.class;
		TestClass obj = (TestClass) clazz.newInstance();
		Field declaredField = clazz.getDeclaredField("address");
		declaredField.set(obj, "济南");
		System.out.println(obj.getAddress());
	}
	/**
	 * 访问private属性
	 * @description  
	 * @Date Jul 21, 2017
	 * @throws Exception
	 */
	@Test
	public void testGetPrivateField() throws Exception{
		Class<? extends Object> clazz = TestClass.class;
		TestClass obj = (TestClass) clazz.newInstance();
		Field declaredField = clazz.getDeclaredField("name");
		declaredField.setAccessible(true); // 访问私有属性,不设置会报错 java.lang.IllegalAccessException: Class com.test.reflect.Reflect4 can not access
										  // a member of class com.test.reflect.TestClass with modifiers "private"
		declaredField.set(obj, "张三");
		System.out.println(obj.getName());
		
	}
	
	
	
}

 

 

 

4、clazz.getMethods 和clazz.getDeclaredMethods的不同

另建一个类,继承 TestClass

 

public class TestClass2  extends TestClass{
	
	private String testSay(){
		return "hello world";
	}
	
	public String testSay2(){
		return "hello world";
	}
}

 

 

测试不同

/**
	 * clazz.getMethods 和clazz.getDeclaredMethods的不同
	 * @description  
	 * @Date Jul 21, 2017
	 */
	@Test
	public void testDifferent(){ 
		Class<?> clazz = TestClass2.class;
		Method[] methods = clazz.getMethods();  // 取出本类中非private的方法。同时会把 父类(父类的父类,父类的父类的父类,。。。)中的方法(不包括private)也取出来
		for(Method method : methods){
			System.out.println(method.getName());
		}
		System.out.println("-----------------------------");
		Method[] declaredMethods = clazz.getDeclaredMethods(); // 自己定义的类中的所有的方法
		for(Method method : declaredMethods){
			System.out.println(method.getName());
		}
	}

 

 

通过结果可以看出

clazz.getMethods();  // 取出本类中非private的方法。同时会把 父类(父类的父类,父类的父类的父类,。。。)中的方法(不包括private)也取出来。

而clazz.getDeclaredMethods(); // 自己定义的类中的所有的方法。

 

 

 

5、反射的简单应用,利用反射复制一个对象

 

 

首先创建一个两类。Child  和 ChildBean。利用反射将Child 复制为 ChildBean

 

Child类

public class Child {
	private Integer id;
	private String name;
	private Integer age;
	private String address;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Child [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
	
	
}

 

ChildBean 类

public class ChildBean {
	private Integer id;
	private String name;
	private Integer age;
	private String address;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "ChildBean [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
	
	
	
}

 

 

利用反射复制

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

import org.apache.commons.lang.StringUtils;
import org.junit.Test;
/**
 * 利用反射,复制
 * @author Administrator
 *
 */
public class Reflect3 {
	
	//  obj --->  newClazz
	public <T> T copyByReflect(Object obj, Class<T> newClazz) throws Exception{
		T newObj = newClazz.newInstance();
		
		Class<?> objClazz = obj.getClass();
		Field[] objFields = objClazz.getDeclaredFields();
		Field[] newFields = newClazz.getDeclaredFields();
		if(newFields.length > 0 && objFields.length >0){
			for(Field newField : newFields){
				String newFieldName = newField.getName();
				for(Field objField : objFields){
					String objFieldName = objField.getName();
					if(objFieldName.equals(newFieldName)){
						String upperFieldName = StringUtils.capitalize(objFieldName); //capitalize  首字母大写(如: name---> Name, id--->Id)
						// get obj field value
						Method getGetMethod = objClazz.getMethod("get"+upperFieldName);
						Object value = getGetMethod.invoke(obj); 
						// set newObj field value
						Method getSetmethod = newClazz.getMethod("set"+upperFieldName, objField.getType());
						getSetmethod.invoke(newObj, value); 
						
					}
				}
			}
		}
		
		
		return  newObj;
	}
		
	@Test
	public void testMain() throws Exception{
		Child child = new Child();
		child.setAddress("山东");
		child.setAge(18);
		child.setId(1);
		child.setName("张三");
		System.out.println("child:"+child);
		ChildBean newChild = this.copyByReflect(child, ChildBean.class);
		System.out.println("childBean:"+newChild);
	}
}

 

 

 

 

 

分享到:
评论

相关推荐

    Java反射学习.pdf

    Java 反射学习 Java 反射是 Java 程序设计语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说 "自审 ",并能直接操作程序的内部属性。Java 反射的能力在实际应用中非常有价值,例如,使用它能获得 ...

    反射学习笔记

    反射学习笔记是深入理解这一关键特性的重要资源。以下是对"反射学习笔记"中可能包含的知识点的详细阐述: 1. **什么是反射**:反射是Java提供的一种机制,能够在运行时获取类的信息(如类名、属性、方法等)并动态...

    反射学习PPT + TEST CODE

    本文将深入探讨“反射学习PPT + TEST CODE”中的核心知识点。 一、反射基础 1. 类型信息:反射允许程序在运行时获取关于类、接口、结构等类型的信息,如类型名称、属性、方法、构造函数等。这在设计动态代码、元...

    反射学习资料

    ### 反射学习资料 #### 引言 反射是Java编程语言中的一个重要概念,它允许程序在运行时检查和修改自身结构与行为的能力。这种能力对于框架开发、单元测试、序列化、远程调用等领域至关重要。本文将深入探讨Java...

    斯金纳操作性条件反射学习理论.ppt

    斯金纳操作性条件反射学习理论.ppt

    java反射学习

    在“JAVA反射学习”这个主题中,我们将深入探讨以下几个关键知识点: 1. **什么是反射**:反射是Java提供的一种能力,通过Class对象来获取关于类的所有信息,并能在运行时创建和访问对象,调用方法,甚至修改私有...

    c# 反射学习

    ### c# 反射学习 #### 一、概述 C#中的反射机制是.NET框架提供的一种强大工具,它允许程序在运行时动态地查询、加载和操作类型信息。通过反射,开发人员能够实现代码的灵活性与扩展性,尤其是在构建插件架构、动态...

    膝跳反射和反射学习教案.pptx

    膝跳反射是一种非条件反射,即一种本能的、无需学习就能发生的反应。当医生或教师轻敲膝盖下方的韧带时,小腿肌肉会不自主地收缩,这就是膝跳反射。这种反应是通过反射弧完成的,包括五个组成部分:感受器、传入神经...

    java反射学习资料

    ### Java反射机制详解 在Java领域,反射(Reflection)是一个强大的功能,允许程序在运行时检查和修改其结构和行为。这种能力对于框架设计、动态代理、类库扩展等场景至关重要。下面,我们将深入探讨Java反射的核心...

    操作条件反射学习自动机及其在机器人平衡控制中的应用

    针对两轮机器人的平衡控制问题, 在学习自动机理论的框架中, 提出一种基于操作条件反射学习自动机的 仿生学习模型. 该模型引入认知学习单元和取向单元, 分别用来实现操作行为学习和指导系统进化的方向. 模拟两轮...

    路由反射学习资料详解

    在路由反射的框架下,BGP路由器可以扮演路由反射器的角色,负责传播IBGP学习到的路由信息给特定的IBGP对等体,而不是要求所有IBGP路由器之间建立连接。这种方法降低了网络的复杂性和维护成本。 2. **设计标准** -...

    java学习——java中的反射学习笔记.rar_java 反射

    Java反射是Java编程语言中的一种强大机制,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射是通过java.lang.Class类和java.lang.reflect包中的类来实现的。本篇笔记将深入探讨...

    Java反射机制的使用和学习方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...

    反射学习笔记含代码

    根据给定的文件信息,我们可以总结出以下关于Java反射机制的知识点: ### 一、反射基本概念 反射是Java的一项强大功能,它允许程序在运行时检查类的信息(如类名、方法、字段等),并可以创建和操作对象。通过反射...

    JAVAWEB反射学习笔记中使用的文件

    在本学习笔记中,我们将深入探讨JavaWeb应用中反射的运用,以及如何通过提供的"src"目录下的源代码来实践这些概念。 首先,反射的核心类是`java.lang.Class`,它代表了Java程序中的类或接口。通过`Class`对象,我们...

    Java第4章面对对象—— 反射学习 程序 .zip

    本资料包主要关注Java的反射机制,通过深入学习,你可以更好地理解和掌握这一强大工具。 在Java中,反射API提供了访问和控制类、接口、字段和方法的能力,即使在编译时未知的情况下也能操作它们。这一特性在许多...

    第四章 第2节 光的反射学习课件

    ### 光的反射学习知识点详解 #### 一、光的反射定律 1. **反射条件**: - 当光遇到不同介质的界面时(如桌面、水面等),会发生反射现象。 2. **有关反射的基本名词**: - **法线**:垂直于介质交界面的直线。 ...

    轻松学C之运行时类型标识反射学习资料PPT学习教案.pptx

    【C#运行时类型标识与反射】 在C#编程语言中,运行时类型标识(Runtime Type Identification,RTTI)是程序在运行时检查和利用对象实际类型的能力。这一特性对于实现多态性和动态类型操作至关重要。C#提供了三个...

    基于滑模思想和Elman 网络的操作条件反射学习控制方法

    射(OCR) 学习控制方法. 该方法采用Elman 网络构造滑模面-行为对的评价函数, 通过滑模面的变化设计奖赏函数, 根据奖赏信号更新评价函数, 实现行为选择概率的更新. 通过每轮次熵的定义, 定量分析了所学知识的变化...

Global site tag (gtag.js) - Google Analytics