`
canofy
  • 浏览: 829729 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

java反射的例子

    博客分类:
  • j2EE
阅读更多
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

个人理解就是在运行时可以得到某个对象的所有信息,包括方法,类型,属性,方法参数,方法返回值以及可以调用该类的所有方法。

下面是两个例子:

package cn.test;


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


/**
 * Java Reflection Cookbook
 *
 * @author Michael Lee
 * @since 2006-8-23
 * @version 0.1a
 */

public class TestReflection {
    /**
     * 得到某个对象的公共属性
     *
     * @param owner, fieldName
     * @return 该属性对象
     * @throws Exception
     *
     */
    public Object getProperty(Object owner, String fieldName) throws Exception {
        Class ownerClass = owner.getClass();

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(owner);

        return property;
    }

    /**
     * 得到某类的静态公共属性
     *
     * @param className   类名
     * @param fieldName   属性名
     * @return 该属性对象
     * @throws Exception
     */
    public Object getStaticProperty(String className, String fieldName)
            throws Exception {
        Class ownerClass = Class.forName(className);

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(ownerClass);

        return property;
    }


    /**
     * 执行某对象方法
     *
     * @param owner
     *            对象
     * @param methodName
     *            方法名
     * @param args
     *            参数
     * @return 方法返回值
     * @throws Exception
     */
    public Object invokeMethod(Object owner, String methodName, Object[] args)
            throws Exception {

        Class ownerClass = owner.getClass();

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(owner, args);
    }


      /**
     * 执行某类的静态方法
     *
     * @param className
     *            类名
     * @param methodName
     *            方法名
     * @param args
     *            参数数组
     * @return 执行方法返回的结果
     * @throws Exception
     */
    public Object invokeStaticMethod(String className, String methodName,
            Object[] args) throws Exception {
        Class ownerClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(null, args);
    }



    /**
     * 新建实例
     *
     * @param className
     *            类名
     * @param args
     *            构造函数的参数
     * @return 新建的实例
     * @throws Exception
     */
    public Object newInstance(String className, Object[] args) throws Exception {
        Class newoneClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Constructor cons = newoneClass.getConstructor(argsClass);

        return cons.newInstance(args);

    }


    
    /**
     * 是不是某个类的实例
     * @param obj 实例
     * @param cls 类
     * @return 如果 obj 是此类的实例,则返回 true
     */
    public boolean isInstance(Object obj, Class cls) {
        return cls.isInstance(obj);
    }
    
    /**
     * 得到数组中的某个元素
     * @param array 数组
     * @param index 索引
     * @return 返回指定数组对象中索引组件的值
     */
    public Object getByArray(Object array, int index) {
        return Array.get(array,index);
    }
}




package cn.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import cn.IpUtils.IpBean;

public class TestObject {
	
	/**
	 * 设置属性值
	 * @param list
	 * @param cla
	 * @return
	 */
	public ArrayList array2bean(ArrayList list, Class cla) {
		ArrayList result = new ArrayList();
		int filed_len = cla.getDeclaredFields().length;
		System.out.println(":"+cla.getDeclaredFields().length);
		for (int i = 0; i < list.size(); i++) {
			Object[] o = (Object[]) list.get(i);
			int length = filed_len < o.length ? filed_len : o.length;
			try {
				result.add(cla.newInstance());
				for (int j = 0; j < length; j++) {
					Method m = null;
					String mName =cla.getDeclaredFields()[j].getName();
					mName = mName.substring(0, 1).toUpperCase()+ mName.substring(1);
					mName = "set" + mName;
					m = cla.getMethod(mName, new Class[] { String.class });
					//调用设置的方法,给属性赋值
					m.invoke(result.get(i), new Object[] { o[j] == null ? "": o[j].toString() });
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return result;
	}
	
	/**
	 * 获取get的取值
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public String getObjectToString(Object obj) throws Exception{
		Class cla=obj.getClass();
		Method[] ma=cla.getDeclaredMethods();//获取所有声明的方法数组
		Method method=null;
		String methodName=null;
		Object returnValue=null;
		for(int i=0;i<ma.length;i++){
			method=ma[i];
			methodName=method.getName();//方法名
			if(methodName.indexOf("get")==0){//以get开始的方法,排除set方法
				returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象
				System.out.print(methodName+"::");
				System.out.println(returnValue==null?"":returnValue.toString());
			}
		}		
		return "";
	}

	/**
	 * 获取对象的属性值,含有get方法的
	 * @param obj
	 * @return
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public String getAttributeValue(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		Class cla=obj.getClass();
		Field[] fds=cla.getDeclaredFields();
		Field field=null;
		String fieldName=null;
		String methodName=null;
		Method method=null;
		Object returnValue=null;
		for(int i=0;i<fds.length;i++){			
			field=fds[i];
			fieldName=field.getName();
			methodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);			
			method=cla.getDeclaredMethod(methodName, null);
			returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象
			System.out.print(methodName+"::");
			System.out.println(returnValue==null?"":returnValue.toString());
		}
		
		return "";
	}
	
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
//		IpBean.class
		TestObject to=new TestObject();
		IpBean ib=new IpBean();
		ib.setFrom("from1");
		ib.setPosition("position1");
		ib.setTo("to1");
		ib.setId(10);
		to.getObjectToString(ib);
//		to.getAttributeValue(ib);
	}

}



package cn.IpUtils;

public class IpBean {
	private String from; // IP段起始
    private String to; // IP结束
    private String position; // 地理名称    
    private int id = 0;

	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getTo() {
		return to;
	}

	public void setTo(String to) {
		this.to = to;
	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	
}

分享到:
评论

相关推荐

    java反射例子,封装了一个反射帮助类

    在标题和描述中提到的“java反射例子,封装了一个反射帮助类”,这表明我们有一个实用工具类,可以帮助简化使用反射的复杂过程。 首先,让我们理解Java反射的基本概念。当我们的程序运行时,我们可以通过Class类来...

    java 反射例子 代码

    java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

    java反射例子

    首先,从标题“java反射例子”来看,这部分内容将围绕Java反射技术的具体应用展开。Java反射API提供的主要类包括java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method和java.lang.reflect....

    JAVA反射机制及应用例子

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

    Java反射简单例子

    考虑到这是一个简单的反射例子,`ReflectTest.java`可能包含以下内容: ```java public class ReflectTest { public String echo(String msg) { return "Echo: " + msg; } public static void main(String[] ...

    Java反射案例

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

    java反射例子 希望可以帮助大家

    以下是对标题和描述中提及的Java反射知识点的详细解释: 1. **获取对象的属性**: 在Java中,通过反射可以获取对象的属性。在示例代码中,`getProperty`方法展示了如何做到这一点。首先,通过`owner.getClass()`...

    java例子 java反射

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

    Java 8个反射实例

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java 8中,虽然没有引入重大的反射新特性,但原有的反射API仍然提供了丰富的功能,使得开发者...

    JAVA反射简单例子

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

    java 反射机制例子

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

    java反射简单例子demo

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

    java反射详解例子

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

    java反射与泛型综合例子

    Java反射和泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的功能,并且在特定情况下可以相互结合使用。本文将深入探讨这两个概念,并通过一个具体的`Testrefl.java`示例来阐述它们的应用。 Java反射...

    反射实例-JAVA反射机制

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

    Java反射简单小实例

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

    java反射小例子

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

    Java反射应用实例

    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...

    Java反射概念及例子

    Java 反射概念及例子 Java 反射机制是一种让框架能够根据 "以字符串形式存在的信息" 来调用对象的属性和函数的技术。这种技术在框架编程中特别有用,因为框架编程中很多类是要根据配置文件来配置确定的,没办法预先...

Global site tag (gtag.js) - Google Analytics