`
zys08
  • 浏览: 142337 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java反射测试例子

阅读更多
package com.reflect;

class Customer
{ 
	private long id;
	private String name;
	private int age;
	
	public Customer()
	{ }
	public Customer(String name, int age) 
	{ 
		this.name = name;  this.age = age;
		} 
	public long getId()
	{
		return id;
		} 
	public void setId(long id) 
	{  
		this.id = id;
		}
	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;
		}
}

 

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testEg

{
	/**
	 * 通过java的反射机制获取类的所有属性和方法 */ 
	@SuppressWarnings("unchecked")
	public void test1()
	{ 
		try 
		{ 
			Class c = Class.forName("com.reflect.Customer");
			
			System.out.println("属性:");
			
			Field f[] = c.getDeclaredFields();
			
			for (int i = 0; i < f.length; i++)
			{
				System.out.println(f[i].getName());
			}
			
			System.out.println("方法:");
			
			Method m[] = c.getDeclaredMethods();
			for (int i = 0; i < m.length; i++)
			{
				System.out.println(m[i].toString());
			}
		} 
			catch (Throwable e)
			{ 
				System.err.println(e);
			}
		}
	
	/**
	 * * 通过java的反射机制动态修改对象的属性 *
	 * 
	 * @param o
	 */
	@SuppressWarnings("unchecked")
	public void test2(Customer o)
	{
		try 
		{ 
			Class c = o.getClass();
			
			// getMethod方法第一个参数指定一个需要调用的方法名称,
			//第二个参数是需要调用方法的参数类型列表,如无参数则可以指定null,该方法返回一个方法对象
		 
			Method sAge = c.getMethod("setAge", new Class[] { int.class });
			
		    Method gAge = c.getMethod("getAge",null);
		    
		    Method sName = c.getMethod("setName", new Class[] { String.class });   // 动态修改Customer对象的age
		    
		    Object[] args1 = { new Integer(25) };
		    
		    sAge.invoke(o, args1);   // 动态取得Customer对象的age
		    
		    Integer AGE = (Integer)gAge.invoke(o, null); 
		    
//		    System.out.println("AGE’Value:"+AGE);
		    
		    Object[] args2 = { new String("李四") };
		    
		    sName.invoke(o, args2); 
		}
		catch (Throwable e){
			
			System.err.println(e); 
	  } 
		
  }
	/**
	 * * 通过java的反射机制做一个简单对象的克隆 *
	 * 
	 * @param o *
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Object test3(Customer o)
	{ 
		Object o2 = null; 
		try
		{  
			Class c = o.getClass();   // 通过默认构造方法创建一个新的对象
			
			o2 = c.getConstructor(new Class[] {}).newInstance(new Object[] {});
			
			Field fields[] = c.getDeclaredFields();
			
			for (int i = 0; i < fields.length; i++)
			{ 
				Field field = fields[i];
				
				String fieldName = field.getName();
//				System.out.println(fieldName+"SS");
				
				String firstLetter = fieldName.substring(0, 1).toUpperCase();    // 获得和属性对应的getXXX()方法的名字

				String getMethodName = "get" + firstLetter + fieldName.substring(1);    // 获得和属性对应的setXXX()方法的名字
			
				String setMethodName = "set" + firstLetter + fieldName.substring(1);     // 获得和属性对应的getXXX()方法

				Method getMethod = c.getMethod(getMethodName, new Class[] {});     // 获得和属性对应的setXXX()方法
				
				Method setMethod = c.getMethod(setMethodName, new Class[] { field.getType() });     // 调用原对象的getXXX()方法

				Object value = getMethod.invoke(o, new Object[] {});    // 调用拷贝对象的setXXX()方法
				
				setMethod.invoke(o2, new Object[] { value }); 
				}  
			} 
		catch (Throwable e) 
			{ 
				System.err.println(e); 
			} 
		return o2; 
	} 
	
	public static void main(String[] args) throws Exception
	{ 
		testEg t = new testEg(); 
		t.test1();
		Customer customer = new Customer(); 
		customer.setAge(20);
		customer.setName("张三");
		System.out.println("调用前name: " + customer.getName()); 
		System.out.println("调用前age: " + customer.getAge());
		t.test2(customer);
		System.out.println("调用后name: " + customer.getName()); 
		System.out.println("调用后age: " + customer.getAge());
		Customer customer2 = (Customer)t.test3(customer); 
		System.out.println("克隆对象的name: " + customer2.getName());
		System.out.println("克隆对象的age: " + customer2.getAge());
	}
	
	
		
}

 

分享到:
评论

相关推荐

    反射机制例子及反射方法调用

    反射机制例子及反射方法调用,自己写的一个测试例子。 例子实现了通过字符串指定类名,并调用类的方法

    JavaReflect:Java反射测试!

    这个小例子简单介绍了Java使用反射的各种方法,帮助大家快速掌握Java反射的基本使用方法。例子程序是用Android Studio编写的,如果你使用Eclipse,新建一个工程,拷贝src下面的几个类过去就可以了.Android Studio用户...

    Java基础语法测试-基础数据类型-注解-数组-inet-反射-oop-Java代码实现

    内容概要:通过带着读者编写Java基础语法测试代码,理解基础数据类型-注解-数组-inet-反射-oop-Java代码实现过程和测试代码 适合人群:初学java语法入门测试代码 能学到什么:①注解、数组、数据类型、inet、method...

    Java 反射佳实践

     本文的例子都可以在示例代码中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request。本文的示例代码主要是基于jOOR行编写的,如果想了解更多请查看这里的测试代码。...

    PHP中的reflection反射机制测试例子

    Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php...

    java 编程入门思考

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Java初学者入门教学

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    java联想(中文)

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    JAVA_Thinking in Java

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Thinking in Java简体中文(全)

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Thinking in Java 中文第四版+习题答案

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 12.2.4...

    java7源码-test1:测试1

    10、利用反射获取构造方法的例子--ReflectTest类. 11、动态代理的例子,以及网上动态代理的例子--com.cn21.invocation包。 12、实现可以接受任意接口及其实现类的动态代理--com.cn21.invocation包. 13、实现接口之间...

    Java面试题大汇总,2023年附答案解析.md

    在java中守护线程和本地线程区别 CMS分为哪几个阶段 抽象的关键字是什么 如何判断对象可以被回收 如何通过反射调用对象的方法 如何进行单元测试 什么情况下会发生栈内存溢出 什么是Hash算法 什么是上下文...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

    Think in Java(中文版)chm格式

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有...

    spring aop+自定义注解+反射实现统一校验脚手架

    工程介绍:SpringBoot项目脚手架,利用spring aop+java反射实现自定义注解校验参数 源码里有使用都例子在DemoContorller example1:校验userName参数必填 @CheckParams(notNull = true) private String userName;...

    janigma:Java Enigma密码机

    例子此实现已通过原始消息进行了测试。 Enigma M3和M4的一些示例配置位于data目录中。 相应的输入可以在测试代码中找到。目标: 模拟... 带有转子I至VIII和反射器A至C的Enigma M3 带希腊转子和薄型反射镜B和C的...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...

Global site tag (gtag.js) - Google Analytics