`
sinye
  • 浏览: 219256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA反射机制例子

    博客分类:
  • java
阅读更多

例子:通过一个代理类(Person.java)动态调用两个相似类(Man.java、Woman.java)。其中,代理类用java反射机制实现。参照:http://java.chinaitlab.com/advance/805648.html

Man.java

public class Man
{
	private String name;
	private int 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;
	}
	public void introduce(String name,Integer age){
		System.out.println("name="+name+"& age="+age);
	}
}

 Woman.java

public class Woman
{
	public Woman(){
		
	}
	public Woman(String name,int age){
		this.name = name;
		this.age = age;
	}
	private String name;
	private int 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;
	}
	public void introduce(){
		System.out.println("name:"+name+" &age:"+age);
	}
}

代理类Person.java

import java.lang.reflect.*;

public class Person
{
	public Person(){
		
	}

	private Object target; // 目标对象
	private String methodName; // 目标方法
	private Object[] params; // 参数数组
	private Method method;
	public Object getTarget()
	{
		return target;
	}
	public void setTarget(Object target)
	{
		this.target = target;
	}
	public String getMethodName()
	{
		return methodName;
	}
	public void setMethodName(String methodName)
	{
		this.methodName = methodName;
	}
	public Object[] getParams()
	{
		return params;
	}
	public void setParams(Object[] params)
	{
		this.params = params;
	}
	public Method getMethod()
	{
		return method;
	}
	public void setMethod(Method method)
	{
		this.method = method;
	}

	/*
	 * 重新设置目标方法
	 */
	public void reSetMethod(String methodName) throws ClassNotFoundException{
		if(params!=null){
			int paramsLength = params.length;
			Class<?>[] paramsTypes = new Class<?>[paramsLength];
			for(int i=0;i<paramsLength;i++){
				paramsTypes[i] = params[i].getClass();
			}//end for
			try{
				method = target.getClass().getMethod(methodName, paramsTypes);
			}catch(Exception e){
				e.printStackTrace();
			}
		}else{
			try{
				method = target.getClass().getMethod(methodName, null);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}//end method
	
	/**
	 * 重新设置目标对象和方法
	 * @throws ClassNotFoundException 
	 */
	public void reSetTarget(Object target,String methodName) throws ClassNotFoundException{
		this.target = target;
		this.reSetMethod(methodName);
	}
	
	/**
	 * 动态调用已绑定的方法
	 */
	public void doMethod() throws Exception{
		reSetTarget(target,methodName);
		this.method.invoke(target, params);
	}
	
}

 

调用代理类

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ProxyTest
{
	
	public void invoke(String className,Class<?>[] calsses,Object[] constructsParams,String methodName,Object[] params)throws Exception{
		Class<?> clazz = Class.forName(className);
		Constructor<?> cons = clazz.getConstructor(calsses);
		Object obj = cons.newInstance(constructsParams);
		Person person = new Person();
		person.setTarget(obj);
		person.setMethodName(methodName);//映射方法名
		person.setParams(params);//映射方法参数
		person.doMethod();//通过反射调用方法
	}

	/**
	 * @throws Exception 
	 * @功能描述  
	 * @输入参数  
	 * @反馈值    
	 */
	public static void main(String[] args) throws Exception
	{
		/**
		 * 运行时动态调用相似类
		 */
		ProxyTest test = new ProxyTest();
		test.invoke("com.sinye.reflect.Man", null, null, "introduce", new Object[]{new String("梁山伯"),25});
		
		test.invoke("com.sinye.reflect.Woman",new Class<?>[]{String.class,int.class}, new Object[]{"祝英台",new Integer(22)}, "introduce", null);
		
		/**
		 * 运行时调用Man类的setName和getName方法
		 */
		Class cc = Class.forName("com.sinye.reflect.Man");
		Object object = cc.newInstance();
		Method m = cc.getDeclaredMethod("setName", new Class[]{String.class});
		m.invoke(object, new Object[]{new String("shanbo")});
		
		m = cc.getDeclaredMethod("getName", null);
		String name = (String) m.invoke(object, null);
		System.out.println(name);
	}
}

 

分享到:
评论

相关推荐

    java反射机制例子

    标题"java反射机制例子"暗示我们将探讨如何在实际应用中使用Java反射。以下是一些关键知识点: 1. **Class对象**:每个类在Java中都有一个对应的Class对象,可以通过`Class.forName("类全名")`获取。Class对象包含...

    java 反射机制例子

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

    JAVA反射机制及应用例子

    JAVA反射机制及应用例子.。。Reflection API

    Java反射简单例子

    下面我们将详细探讨Java反射的基本概念、使用场景以及如何通过`ReflectTest.java`这个简单的例子来理解反射。 ### 1. 反射的基本概念 反射机制允许我们在运行时检查类的信息,包括类名、方法名、参数类型等,并且...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    java反射机制实现例子

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

    反射实例-JAVA反射机制

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

    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编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    JAVA反射简单例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Spring框架中,反射扮演着核心角色,...希望这个简单的反射例子能帮助你更好地理解和运用Java反射。

    java例子 java反射

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

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    java反射详解例子

    "java反射机制详解" Java 反射机制是 Java 语言中的一种功能,它允许程序员在运行时检查和修改一个类的结构和行为。 Java 反射机制提供了一种获取类的信息、创建对象、调用方法和获取字段值的方式。 在 Java 中,...

    Java中的反射机制

    Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...

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

    反射机制例子及反射方法调用 反射机制是一种非常强大的机制,它允许我们在运行时动态地加载和使用类、方法、变量等,这种机制可以使我们的程序更加灵活和可扩展。在Java中,反射机制是通过java.lang.reflect包来...

    java 反射机制

    ### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...

Global site tag (gtag.js) - Google Analytics