`
zys08
  • 浏览: 144723 次
  • 性别: 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());
	}
	
	
		
}

 

分享到:
评论

相关推荐

    java例子 java反射

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...通过分析这些例子,你可以更深入地理解Java反射的使用方式及其在实际开发中的应用。

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    java反射简单例子demo

    Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象并调用其方法。在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`、`Constructor`、`...

    java反射小例子

    标题“java反射小例子”暗示这是一个关于如何在实际项目中应用反射的小型示例。通常,这样的示例会展示如何使用反射来实现以下功能: 1. **获取类信息**:通过`Class.forName()`方法,我们可以根据类名动态加载类...

    Java反射简单例子

    这个“Java反射简单例子”将深入解释如何使用反射API来动态地创建对象,访问类的属性和方法。下面我们将详细探讨相关知识点。 首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于...

    Java反射简单小实例

    ### Java反射机制简介 Java反射机制是Java编程语言的一个强大特性,它允许程序在运行时检查自身,并且能够“看”到类的信息(字段、方法等),甚至可以在运行时调用这些方法或修改这些字段的值。这为开发带来了很大...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    ehcache 测试 反射类 例子

    总结起来,这个例子展示了如何将Ehcache的强大缓存能力与Java反射机制相结合,以提高测试的灵活性和覆盖率。通过深入研究源代码,你可以更好地理解这两种技术如何协同工作,为Java应用程序带来更高效的性能和更全面...

    java反射机制实现例子

    下面是一个简单的Java反射机制的实现例子: ```java import java.lang.reflect.Field; public class ReflectionExample { private String privateField = "默认值"; public static void main(String[] args) ...

    java反射机制小例子

    下面我们将深入探讨这个小例子以及Java反射机制的相关知识点。 首先,`Class.forName()`方法在例子中被用来动态加载类。`Class.forName(String className)`接收一个类的全名(包括包名),然后返回对应的`Class`...

    java反射实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在标题“Java反射实例”中,我们聚焦于如何在实际编程中应用这一特性。通过反射,我们可以动态地...

    java反射的简单代码例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理以及...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java 反射实例,大量注释,简单易懂

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时创建和访问这些类的对象。在Java中,反射提供了对类对象的元数据(metadata)的访问,使得我们可以...

    Java反射演示Demo

    在“Java反射演示Demo”中,可能会包含创建对象的例子。通常,我们使用new关键字来创建对象,但反射允许我们在运行时动态创建对象,即使我们没有类的实例。可以这样实现: ```java Constructor&lt;?&gt; constructor = ...

    JAVA反射机制的简单理解

    Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...

    java反射机制测试代码

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种能力使得Java代码能够具备高度的动态性,能够在不预先知道具体类的情况下,调用类的方法,访问字段,...

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

    3. 测试框架:反射机制可以用于实现测试框架,测试框架可以使用反射机制来动态地加载和使用类、方法、变量等。 在这个例子中,我们可以看到反射机制的强大之处,它可以使我们的程序更加灵活和可扩展。但是,反射...

    就几个反射的例子

    总结起来,Java反射是一个强大但需要谨慎使用的特性。它为开发者提供了运行时的灵活性,但也带来了潜在的风险。理解和熟练运用反射,可以极大地提升Java应用程序的动态性和适应性。在实际开发中,要根据需求权衡利弊...

Global site tag (gtag.js) - Google Analytics